Как мне перечислить через 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 } );