我有一个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\"}]}]"
}
]
}
答案 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。