3
votes

Comment analyser la liste des nœuds enfants JSON qui ont des noms différents à l'aide de Newtonsoft.json en C #

Je cherche à analyser JSON dans une liste C #. Le problème est que les données que j'essaie d'analyser ne sont pas fournies au format Array. Voici l'exemple JSON

List<Record> Records

Ma classe Model ressemble à quelque chose comme ça

public class Record
{
    public string Name { get; set; }

    public string Description { get; set; }
}

Ce que je recherche, c'est de créer un p >

   {
   "results":{
      "records":{
         "record:8545314564":{
            "name":"record 1",
            "description":"description for record 1"
         },
         "record:2254698789":{
            "name":"record 2",
            "description":"description for record 2"
         },
         "record:7454687851":{
            "name":"record 3",
            "description":"description for record 3"
         }
      }
   }
}

Je me fiche du nom du nœud enfant des enregistrements (par exemple, enregistrement: 8545314564, enregistrement: 2254698789, etc.). Tout ce qui m'importe, c'est le nom et la propriété de description à l'intérieur de chaque nœud d'enregistrement.

J'apprécierais vraiment que quelqu'un puisse fournir un exemple de code en C # pour obtenir le résultat souhaité.


0 commentaires

4 Réponses :


0
votes

Vous pouvez faire ce qui suit:

public class RootObject
{
    public ResultObject results { get; set; }
}

public class ResultObject
{
    public Dictionary<string, RecordObject> records { get; set; }
}

public class RecordObject
{
    public string name { get; set; }
    public string description { get; set; }
}

Où RootObject est défini comme

var result = JsonConvert.DeserializeObject<RootObject>(jsonString);
var recordCollection = result.results.records.Values.ToList();

Sortie

 entrez la description de l'image ici


0 commentaires

1
votes

En utilisant un Dictionnaire , vous pouvez utiliser un nom d'enregistrement dynamique comme clé.

public class Root
{
    [JsonProperty("results")]
    public Result Results { get; set; }
}

public class Result
{
    [JsonProperty("records")]
    public Dictionary<string, Record> Records { get; set; }
}

public class Record
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }
}

var data = JsonConvert.DeserializeObject<Root>(json);


0 commentaires

0
votes

Vous pouvez analyser le Json, puis parcourir les jetons pour chaque valeur de propriété.

// assuming json is your json string
JObject obj = JObject.Parse(json);
JToken sec = obj["results"]["records"];

 foreach (JToken token in sec)
 {
      string name = token.First()["name"].ToString();
      string description = token.First()["description"].ToString();
 }


0 commentaires

2
votes

Et une autre alternative:

using Newtonsoft.Json.Linq;
...
var jObject = JObject.Parse(yourJsonString);
var records = jObject["results"]["records"]
    .Children()
    .Children()
    .Select(i => i.ToObject<Record>())
    .ToList();

Vous pouvez trouver la documentation Json.NET pertinente ici: https://www.newtonsoft.com/json/help/html/SerializingJSONFragments. htm


0 commentaires