J'essaie de déterminer comment accéder aux données qui se trouvent dans mon JObject et je ne peux pas pour toute la vie déterminer comment les utiliser.
JObject Object = (JObject)Response.Data["my_key"];
Je peux l'imprimer sur la console en faisant Console.WriteLine (Object) et je vois les données, ça ressemble à:
{
"my_data" : "more of my string data"
...
}
Mais je n'ai aucune idée de comment simplement itérer/énumérer, tout le monde a des idées? Je suis tellement perdu en ce moment.
Si vous regardez la documentation de JObject
, vous verrez qu’elle implémente IEnumerable<KeyValuePair<string, JToken>>
. Donc, vous pouvez le parcourir simplement en utilisant une foreach
:
foreach (var x in obj)
{
string name = x.Key;
JToken value = x.Value;
…
}
JObjects peut être énuméré via JProperty object en le convertissant en JToken :
foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject
string name = x.Name;
JToken value = x.Value;
}
Si vous avez un objet JO imbriqué dans un autre objet, vous n'avez pas besoin de transtyper, car l'accesseur renvoie un objet JToken:
foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects
string name = x.Name;
JToken value = x.Value;
}
La réponse n'a pas fonctionné pour moi. Je ne sais pas comment il a obtenu autant de votes. Bien que cela ait aidé à me diriger dans une direction.
C'est la réponse qui a fonctionné pour moi:
foreach (var x in jobj)
{
var key = ((JProperty) (x)).Name;
var jvalue = ((JProperty)(x)).Value ;
}
Pour les gens comme moi, linq addicts, et basé sur la réponse de svick , voici une approche linq:
using System.Linq;
//...
//make it linq iterable.
var obj_linq = Response.Cast<KeyValuePair<string, JToken>>();
Vous pouvez maintenant créer des expressions linq telles que:
JToken x = obj_linq
.Where( d => d.Key == "my_key")
.Select(v => v)
.FirstOrDefault()
.Value;
string y = ((JValue)x).Value;
Ou juste:
var y = obj_linq
.Where(d => d.Key == "my_key")
.Select(v => ((JValue)v.Value).Value)
.FirstOrDefault();
Ou celui-ci pour parcourir toutes les données:
obj_linq.ToList().ForEach( x => { do stuff } );