[c#] JObject를 통해 어떻게 열거합니까?

내 JObject에있는 데이터에 액세스하는 방법을 결정하려고하는데 평생 사용 방법을 결정할 수 없습니다.

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

Console.WriteLine (Object)을 수행하여 콘솔에 인쇄 할 수 있으며 데이터를 볼 수 있습니다.

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

그러나 나는 그것을 통해 반복 / 열거하는 방법을 모른다. 누구나 아이디어가 있습니까? 나는 지금 그렇게 헤매고있다.



답변

당신이 보는 경우에 대한 설명서JObject , 당신은 그것을 구현하는 것을 볼 수 있습니다 IEnumerable<KeyValuePair<string, JToken>>. 따라서 간단히 다음을 사용하여 반복 할 수 있습니다 foreach.

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


답변

JObjects을 통해 열거 할 수 JProperty의 A를 캐스팅하여 객체 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 } ); 


답변