Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deserialize nested JSON into C# objects

I am getting JSON back from an API that looks like this:

{   "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"] } 

I have tried a few approaches to represent this JSON in c# objects (too many to list here). I've tried with lists and dictionaries, here is a recent example of how I've tried to represent it:

    private class Response     {         public Item Items { get; set; }         public string[] Errors { get; set; }     }      private class Item     {         public List<SubItem> SubItems { get; set; }     }      private class SubItem     {         public List<Info> 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; }     } 

And here is the method I am using to deserialize the 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<Response>(jr);     } 

obj contains Items and Errors. And Items contains SubItems, but SubItems is null. So nothing except for Errors is actually getting deserialized.

It should be simple, but for some reason I can't figure out the correct object representation

like image 407
user3574076 Avatar asked Aug 05 '16 15:08

user3574076


2 Answers

Use this this site for representation:

https://quicktype.io/csharp/

something like this may help you

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> Item322A { get; set; }     public List<Item2B> Item2B { get; set; } }  public class jsonObject {     public Items Items { get; set; }     public List<string> Errors { get; set; } } 

Here is how to deserialize (use JsonConvert class):

jsonObject ourlisting = JsonConvert.DeserializeObject<jsonObject>(strJSON); 
like image 150
R.You Avatar answered Sep 21 '22 10:09

R.You


For "Items" use a Dictionary<string, List<Info>>, i.e.:

class Response {     public Dictionary<string, List<Info>> 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; } } 

This assumes that the item names "Item322A" and "Item2B" will vary from response to response, and reads these names in as the dictionary keys.

Sample fiddle.

like image 38
dbc Avatar answered Sep 22 '22 10:09

dbc