使用嵌入在字符串值中的子对象反序列化JSON字符串

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (86)

我有一个JSON字符串,我试图一举反序列化为C#。

SalesLines的Children节点是字符串表示形式。在反序列化时,我希望对象一直向下。使用JSON.NET最好的方法是什么?

{
   "value":[
      {
         "documentType":"Quote",
         "SONumber":"S-QUO1001",
         "SalesLines":"[{\"SONumber\":\"S-QUO1001\",\"LineNum\":10000,\"ItemId\":\"1936-S\",\"ItemAttributes\":[{\"AttibuteName\":\"COLOR\",\"AttributeValue\":\"YELLOW\"},{\"AttibuteName\":\"DEPTH\",\"AttributeValue\":\"100\"},{\"AttibuteName\":\"WIDTH\",\"AttributeValue\":\"120\"},{\"AttibuteName\":\"HEIGHT\",\"AttributeValue\":\"115\"},{\"AttibuteName\":\"MATERIAL DESCRIPTION\",\"AttributeValue\":\"COTTON, WOOD LEGS\"},{\"AttibuteName\":\"MODEL YEAR\",\"AttributeValue\":\"1940\"}]}]"
      }
   ]
}
提问于
用户回答回答于

您的SalesLines属性的值是双序列化的JSON:包含作为字符串文字嵌入的JSON的字符串值。您希望一步将其内容反序列化为最终数据模型。

要查看数据模型的外观,您可以按如下方式取消JSON:

var json = JToken.Parse(jsonString);

foreach(var token in json.SelectTokens("value[*].SalesLines").ToList())
{
    token.Replace(JToken.Parse((string)token));
}

Console.WriteLine(json);

然后使用如何从JSON对象字符串自动生成C#类文件中提到的代码生成工具之一,从未转义的JSON(我使用http://json2csharp.com/)生成数据模型:

public class ItemAttribute
{
    public string AttibuteName { get; set; }
    public string AttributeValue { get; set; }
}

public class SalesLine
{
    public string SONumber { get; set; }
    public int LineNum { get; set; }
    public string ItemId { get; set; }
    public List<ItemAttribute> ItemAttributes { get; set; }
}

public class Value
{
    public string documentType { get; set; }
    public string SONumber { get; set; }
    public List<SalesLine> SalesLines { get; set; }
}

public class RootObject
{
    public List<Value> value { get; set; }
}

最后,EmbeddedLiteralConverter<List<SalesLine>>这个答案中应用如何在JSON对象中转换转义的JSON字符串?Value

public class Value
{
    public string documentType { get; set; }
    public string SONumber { get; set; }

    [JsonConverter(typeof(EmbeddedLiteralConverter<List<SalesLine>>))]
    public List<SalesLine> SalesLines { get; set; }
}

现在,您将能够RootObject直接反序列化JSON :

root = JsonConvert.DeserializeObject<RootObject>(jsonString);

演示在这里小提琴。

用户回答回答于

创建一个将存储SalesLines的类,另一个将存储ItemAttributes的类。

SalesLines类应该具有属性List。

创建一个SalesOrder类,将List作为其中一个属性。

然后你应该能够反序列化到SalesOrder。

扫码关注云+社区

领取腾讯云代金券