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

时间:2019-05-14 18:33:52

标签: c# json json.net

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

SalesLines的子节点是字符串表示形式。反序列化时,我一直希望对象一直向下。使用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\"}]}]"
      }
   ]
}

2 个答案:

答案 0 :(得分:1)

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);

然后使用 How to auto-generate a C# class file from a JSON object string 中提到的一种代码生成工具从未转义的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; }
}

最后,将this answer中的EmbeddedLiteralConverter<List<SalesLine>>应用于 How do I convert an escaped JSON string within a JSON object? 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; }
}

现在您将可以直接将JSON反序列化为RootObject

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

演示小提琴here

答案 1 :(得分:-2)

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

SalesLines类应具有属性列表。

创建一个将List作为属性之一的SalesOrder类。

然后,您应该可以反序列化为SalesOrder。