将嵌套的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包含ItemsErrors 。 而Items包含SubItems ,但SubItemsnull 。 因此,除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"将因响应而异,并将这些名称作为字典键读取。

样品小提琴 。

使用此网站进行表示:

http://json2csharp.com/

这样的事可能会对你有所帮助

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