如何通过JObject枚举?

Gee*_*esu 101 c# json json.net

我正在尝试确定如何访问我的JObject中的数据,而我无法确定如何使用它.

JObject Object = (JObject)Response.Data["my_key"];
Run Code Online (Sandbox Code Playgroud)

我可以将它打印到控制台上做Console.WriteLine(对象),我看到数据,它看起来像:

{
 "my_data" : "more of my string data"
...
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何通过迭代/枚举,任何人有任何想法?我现在正处于亏损状态.

svi*_*ick 156

如果您查看文档JObject,您将看到它实现IEnumerable<KeyValuePair<string, JToken>>.因此,您可以使用以下命令迭代它foreach:

foreach (var x in obj)
{
    string name = x.Key;
    JToken value = x.Value;
    …
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,但由于我不理解的原因,除非您明确转换为可枚举类型,否则不能将它与Linq一起使用.即你(`(IEnumerable <KeyValuePair <string,JToken >>)obj).选择(...)`而不是普通的`obj.Select(...)`; 或者至少我发现它是我代码的一部分. (3认同)
  • @AdrianRatnapala嗯,你是对的.这是因为`JObject`实现了'IEnumerable <KeyValuePair <string,JToken >>`和`IEnumerable <JToken>`(间接通过`JContainer`). (3认同)
  • 现在我如何将它用于嵌套JSON?例如,如果"value"包含另一组key:value对,我如何使用`JToken值'迭代下一组对? (3认同)
  • @AdrianRatnapala你的obj被宣布为动态吗?扩展方法(如Enumerable.Select)不适用于此. (2认同)
  • @AdrianRatnapala 尝试在 `JObject` 上使用 `Properties()` 方法。例如:`jObject.Properties().Select(p =&gt; p.Name + ": " + p.Value)`。 (2认同)

Dan*_*iel 48

JObjects可以通过列举JProperty对象通过它投射到JToken:

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

如果你在另一个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;
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以像这样方便地使用linq:`obj.Properties().选择(p => p.Name +":"+ p.Value)`. (3认同)
  • 感谢您提供有用的信息! (2认同)

jax*_*xbo 13

答案对我不起作用.我不知道它是如何得到这么多的选票.虽然它帮助我指明了方向.

这个答案对我有用:

foreach (var x in jobj)
{
    var key = ((JProperty) (x)).Name;
    var jvalue = ((JProperty)(x)).Value ;
}
Run Code Online (Sandbox Code Playgroud)


dan*_*era 6

对于像我这样的linq 上瘾者,根据 svick 的回答,这里有一个 linq 方法:

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

现在您可以创建 linq 表达式,例如:

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

要不就:

var y = obj_linq
       .Where(d => d.Key == "my_key")
       .Select(v => ((JValue)v.Value).Value)
       .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

或者用这个迭代所有数据:

obj_linq.ToList().ForEach( x => { do stuff } ); 
Run Code Online (Sandbox Code Playgroud)