将嵌套的JSON反序列化为C#对象
我从一个看起来像这样的API获取JSON:
{ "Items": { "Item322A": [{ "prop1": "string", "prop2": "string", "prop3": 1, "prop4": false },{ "prop1": "string", "prop2": "string", "prop3": 0, "prop4": false }], "Item2B": [{ "prop1": "string", "prop2": "string", "prop3": 14, "prop4": true }] }, "Errors": ["String"] }
我已经尝试了一些方法来在c#对象中表示这个JSON(这里列出的太多了)。 我已尝试使用列表和词典,这是我最近尝试如何表示它的示例:
private class Response { public Item Items { get; set; } public string[] Errors { get; set; } } private class Item { public List SubItems { get; set; } } private class SubItem { public List Infos { get; set; } } private class Info { public string Prop1 { get; set; } public string Prop2 { get; set; } public int Prop3 { get; set; } public bool Prop4 { get; set; } }
这是我用来反序列化JSON的方法:
using (var sr = new StringReader(responseJSON)) using (var jr = new JsonTextReader(sr)) { var serial = new JsonSerializer(); serial.Formatting = Formatting.Indented; var obj = serial.Deserialize(jr); }
obj
包含Items
和Errors
。 而Items
包含SubItems
,但SubItems
为null
。 因此,除Errors
之外的任何内容实际上都不会被反序列化。
它应该很简单,但由于某种原因,我无法弄清楚正确的对象表示
对于"Items"
使用Dictionary
,即:
class Response { public Dictionary> Items { get; set; } public string[] Errors { get; set; } } class Info { public string Prop1 { get; set; } public string Prop2 { get; set; } public int Prop3 { get; set; } public bool Prop4 { get; set; } }
这假设项目名称"Item322A"
和"Item2B"
将因响应而异,并将这些名称作为字典键读取。
样品小提琴 。
使用此网站进行表示:
这样的事可能会对你有所帮助
public class Item322A { public string prop1 { get; set; } public string prop2 { get; set; } public int prop3 { get; set; } public bool prop4 { get; set; } } public class Item2B { public string prop1 { get; set; } public string prop2 { get; set; } public int prop3 { get; set; } public bool prop4 { get; set; } } public class Items { public List Item322A { get; set; } public List Item2B { get; set; } } public class jsonObject { public Items Items { get; set; } public List Errors { get; set; } }
以下是如何反序列化(使用JsonConvert类):
jsonObject ourlisting = JsonConvert.DeserializeObject(strJSON);
您可以使用Json.Parse以便可以查询数据 – 并且只使用单个模型。
private class Info { public string Prop1 { get; set; } public string Prop2 { get; set; } public int Prop3 { get; set; } public bool Prop4 { get; set; } } var result = JObject.Parse(resultContent); //parses entire stream into JObject, from which you can use to query the bits you need. var items = result["Items"].Children().ToList(); //Get the sections you need and save as enumerable (will be in the form of JTokens) List infoList = new List (); //init new list to store the objects. //iterate through the list and match to an object. If Property names don't match -- you could also map the properties individually. Also useful if you need to dig out nested properties. foreach(var subItem in items){ foreach(JToken result in subItem){ Info info = result.ToObject (); infoList.add(info); }}