web-dev-qa-db-fra.com

Comment énumérer un objet JObject?

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.

83
Geesu

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;
    …
}
134
svick

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

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

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 } ); 
0
dani herrera