3 votes

C# obtenir la valeur d'un objet json désérialisé

Je suis actuellement en train de désérialiser une chaîne json en utilisant le paquet nuget Newtonsoft.Json en utilisant le code suivant :

var data = (JObject)JsonConvert.DeserializeObject(json);

Je reçois maintenant un objet au format suivant :

{{  "meta": {    "rap": 2098,    "count": 5  },  "data": [    {      "name": "Gold Tetramino of Mastery",      "rap": 735,      "uaid": "16601901",      "link": "https://www.roblox.com/Gold-Tetramino-of-Mastery-item?id=5786047",      "img": "https://t4.rbxcdn.com/081337d7ea86e6a406512aaa83bbcdeb",      "serial": "---",      "count": 1    },    {      "name": "Silver Tetramino of Accomplishment",      "rap": 385,      "uaid": "16601900",      "link": "https://www.roblox.com/Silver-Tetramino-of-Accomplishment-item?id=5786026",      "img": "https://t1.rbxcdn.com/60da69cd76f8dad979326f63f4a5b657",      "serial": "---",      "count": 1    },    {      "name": "Subzero Ski Specs",      "rap": 370,      "uaid": "155175547",      "link": "https://www.roblox.com/Subzero-Ski-Specs-item?id=19644587",      "img": "https://t4.rbxcdn.com/8ead2b0418ef418c7650d34103d39b6d",      "serial": "---",      "count": 1    },    {      "name": "Rusty Tetramino of Competence",      "rap": 319,      "uaid": "16601899",      "link": "https://www.roblox.com/Rusty-Tetramino-of-Competence-item?id=5785985",      "img": "https://t2.rbxcdn.com/968ad11ee2f4ee0861ae511c419148c8",      "serial": "---",      "count": 1    },    {      "name": "Bluesteel Egg of Genius",      "rap": 289,      "uaid": "16601902",      "link": "https://www.roblox.com/Bluesteel-Egg-of-Genius-item?id=1533893",      "img": "https://t7.rbxcdn.com/48bf59fe531dd1ff155e455367e52e73",      "serial": "---",      "count": 1    }  ]}}

J'essaie maintenant d'en tirer la valeur suivante :

"rap": 2098,

J'ai juste besoin de 2098 et j'ai essayé le code suivant :

string rap = data["rap"].Value<string>();

Mais malheureusement, cela ne fonctionnerait pas. Quelqu'un a-t-il une idée de la manière d'obtenir la valeur ?

4voto

Stuart Points 2661

Essayez :

var result = data["meta"]["rap"].Value<int>();

ou

var result = data.SelectToken("meta.rap").ToString();

ou si vous ne voulez pas passer le chemin entier, vous pouvez juste rechercher la propriété comme ceci :

var result = data.Descendants()
                 .OfType<JProperty>()
                 .FirstOrDefault(x => x.Name == "rap")
                 ?.Value;

2voto

Chris Watts Points 198

Au lieu de déclarer un type var et de laisser le compilateur le trier, déclarez un type dynamique et utilisez la méthode Parse.

dynamic data = JArray.Parse(json);

Essayez alors

data.meta.rap

Pour obtenir l'objet de rap interne. J'ai modifié l'utilisation de la méthode deserializeobject car je pensais à tort qu'elle avait un type de retour dynamique. Voir ici sur la documentation de json.net pour plus de détails : http://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

1voto

Eric Points 1132
var jobject = (JObject)JsonConvert.DeserializeObject(json);
var jvalue = (JValue)jobject["meta"]["rap"];
Console.WriteLine(jvalue.Value); // 2098

0voto

simonlchilds Points 1658

La valeur est en fait un int type. Essayez :

int rap = data["rap"].Value<int>();

0voto

billisphere Points 522
string rap = JsonConvert.DeserializeObject<dynamic>(json).meta.rap;
Console.WriteLine(rap); // 2098

Si vous n'êtes pas dans dynamic (ou qui n'utilisent pas .NET 4+), j'aime bien la manière dont cette autre réponse s'appuie uniquement sur l'API de Json.NET.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X