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

编程入门 行业动态 更新时间:2024-10-18 16:43:53
本文介绍了反序列化带有嵌入在字符串值中的子对象的JSON字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

I have a JSON String that I'm trying to deserialize to C# in one swoop.

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

The Children nodes of SalesLines is a string representation. I want objects all the way down when I deserialize. What is the best way to this with 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.您想一步将其内容反序列化为最终的数据模型.

The value of your SalesLines property is double-serialized JSON: a string value that contains JSON embedded as a string literal. You would like to deserialize its contents to a final data model in one step.

要查看数据模型的外观,可以按如下所示对JSON进行转义:

To see what the data model should look like, you can unescape the JSON as follows:

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生成数据模型(我使用了 json2csharp/):

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 代码>:

Finally, apply EmbeddedLiteralConverter<List<SalesLine>> from this answer to How do I convert an escaped JSON string within a JSON object? to 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 :

Now you will be able to deserialize the JSON to RootObject directly:

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

演示小提琴此处.

更多推荐

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

本文发布于:2023-11-17 02:30:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1608481.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   对象   序列化   字符串值   JSON

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!