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
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 .
Utilisez ce site pour la représentation:
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);
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);
}}