Как мне перечислить через JObject?

Я пытаюсь определить, как получить доступ к данным, которые есть в моем объекте JO, и я не могу на всю жизнь определить, как его использовать.

JObject Object = (JObject)Response.Data["my_key"];

Я могу напечатать это на консоли, выполнив Console.WriteLine(Object), и я вижу данные, это выглядит так:

{
 "my_data" : "more of my string data"
...
}

Но я понятия не имею, как просто перебрать / перечислить, у кого-нибудь есть идеи? Я сейчас в такой растерянности.

3 ответа

Решение

Если вы посмотрите на документацию дляJObject, вы увидите, что он реализует IEnumerable<KeyValuePair<string, JToken>>, Таким образом, вы можете перебрать его, просто используя foreach:

foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    …
}

JObjects можно перечислить через объекты JProperty, приведя его к JToken:

foreach (JProperty x in (JToken)obj) { // if 'obj' is a JObject
    string name = x.Name;
    JToken value = x.Value;
}

Если у вас есть вложенный JObject внутри другого JObject, вам не нужно приводить, потому что метод доступа возвратит JToken:

foreach (JProperty x in obj["otherObject"]) { // Where 'obj' and 'obj["otherObject"]' are both JObjects
    string name = x.Name;
    JToken value = x.Value;
}

Ответ не работает для меня. Я не знаю, как он получил так много голосов. Хотя это помогло указать мне направление.

Это ответ, который работал для меня:

foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}

Для людей, подобных мне, наркоманам linq, и основываясь на ответе svick, вот подход linq:

using System.Linq;
//...
//make it linq iterable. 
var obj_linq = Response.Cast<KeyValuePair<string, JToken>>();

Теперь вы можете создавать выражения linq, такие как:

JToken x = obj_linq
          .Where( d => d.Key == "my_key")
          .Select(v => v)
          .FirstOrDefault()
          .Value;
string y = ((JValue)x).Value;

Или просто:

var y = obj_linq
       .Where(d => d.Key == "my_key")
       .Select(v => ((JValue)v.Value).Value)
       .FirstOrDefault();

Или этот, чтобы перебрать все данные:

obj_linq.ToList().ForEach( x => { do stuff } ); 
Другие вопросы по тегам