JObject를 통해 어떻게 열거합니까?


111

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

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

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

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

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

답변:


167

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

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

3
이것은 정확하지만 내가 이해하지 못하는 이유로 열거 가능한 유형으로 명시 적으로 캐스팅하지 않는 한 Linq와 함께 사용할 수 없습니다. 즉 당신 ((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)은 평범한 노인 대신에 obj.Select(...); 또는 적어도 그것이 내 코드의 한 부분을 찾은 것입니다.
Adrian Ratnapala 2014

2
@AdrianRatnapala obj가 동적으로 선언 되었습니까? 확장 메서드 (예 : Enumerable.Select)는 작동하지 않습니다.
svick 2014

1
아니요, 제 경우 obj에는 유형이있었습니다 JObject. 그러나 JObject와 비슷한 문제를 갖고있는 것 같아요 dynamic. 컴파일러는 형식 인수를 .Select. 나는, 명시 적으로 그들에게 줄 수 obj.Select<KeyValuePair<string, JToken>, (result type)>(...)도 나를 위해 작동
아드리안 Ratnapala에게

3
@AdrianRatnapala 흠, 맞아요. 및 (간접적으로를 통해 ) JObject구현 하기 때문 입니다. IEnumerable<KeyValuePair<string, JToken>>IEnumerable<JToken>JContainer
svick 2014

3
이제 중첩 JSON에 어떻게 사용합니까? 예를 들어 "값"에 다른 키 : 값 쌍 집합이 포함되어있는 경우 JToken value를 사용하여 다음 쌍 집합을 반복 하려면 어떻게 해야합니까?
AlbatrossCafe

53

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

3
다음과 같이 linq를 편리하게 사용할 수도 있습니다 obj.Properties().Select(p => p.Name + ": " + p.Value)..
itslittlejohn 2017-08-02

이것이 제가 찾고 있던 정보였습니다. 정말 고맙습니다!
jhoepken

15

대답은 저에게 효과가 없었습니다. 어떻게 그렇게 많은 표를 얻었는지 모르겠습니다. 그것은 나를 방향으로 가리키는 데 도움이되었지만.

이것은 나를 위해 일한 대답입니다.

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

1
(이 줄 뒤에 : JObject priceComplianceJson = JObject.Parse (File.ReadAllText (fullPath));) "System.Collections.Generic.KeyValuePair <string, Newtonsoft.Json.Linq.JToken> 유형을 변환 할 수 없습니다. ' to 'Newtonsoft.Json.Linq.JProperty' "캐스팅 제거는 작동합니다. var key = x.Key; var jvalue = x.Value; -적어도 컴파일은 ... 내일 기능을 체코 어로하겠습니다.
B. Clay Shannon

3

나와 같은 사람들, 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 } ); 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.