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
Use this this site for representation:
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);
For "Items"
use a Dictionary<string, List<Info>>
, ie:
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 .
You could use Json.Parse
so that you can query into the data -- and just use the single model.
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<Info> infoList = new List<Info>(); //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<Info>();
infoList.add(info);
}}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.