web-dev-qa-db-fra.com

Désérialiser le JSON imbriqué en objets C #

Je récupère JSON d'une API qui ressemble à ceci:

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

J'ai essayé quelques approches pour représenter ce JSON dans des objets c # (trop nombreux pour être listés ici). J'ai essayé avec des listes et des dictionnaires, voici un exemple récent de la façon dont j'ai essayé de le représenter:

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

Et voici la méthode que j'utilise pour désérialiser le 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 contient Items et Errors. Et Items contient SubItems, mais SubItems est null. Donc rien à part Errors ne se désérialise réellement.

Cela devrait être simple, mais pour une raison quelconque, je ne peux pas comprendre la représentation d'objet correcte

13
user3574076

Pour "Items" utiliser un Dictionary<string, List<Info>>, c'est à dire.:

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

Cela suppose que les noms d'élément "Item322A" et "Item2B" variera d'une réponse à l'autre et lit ces noms comme clés de dictionnaire.

Exemple violon .

13
dbc

Utilisez ce site pour la représentation:

http://json2csharp.com/

quelque chose comme ça peut vous aider

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

Voici comment désérialiser (utiliser la classe JsonConvert):

jsonObject ourlisting = JsonConvert.DeserializeObject<jsonObject>(strJSON);
17
R.You

Vous pouvez utiliser Json.Parse afin que vous puissiez interroger les données - et simplement utiliser le modèle unique.

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);
}}
3
error-driven-dev