답변:
당신이 보는 경우에 대한 설명서JObject
, 당신은 그것을 구현하는 것을 볼 수 있습니다 IEnumerable<KeyValuePair<string, JToken>>
. 따라서 간단히 다음을 사용하여 반복 할 수 있습니다 foreach
.
foreach (var x in obj)
{
string name = x.Key;
JToken value = x.Value;
…
}
obj
에는 유형이있었습니다 JObject
. 그러나 JObject
와 비슷한 문제를 갖고있는 것 같아요 dynamic
. 컴파일러는 형식 인수를 .Select
. 나는, 명시 적으로 그들에게 줄 수 obj.Select<KeyValuePair<string, JToken>, (result type)>(...)
도 나를 위해 작동
JObject
구현 하기 때문 입니다. IEnumerable<KeyValuePair<string, JToken>>
IEnumerable<JToken>
JContainer
JToken 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;
}
obj.Properties().Select(p => p.Name + ": " + p.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 } );
((IEnumerable<KeyValuePair<string, JToken>>)obj).Select(...)
은 평범한 노인 대신에obj.Select(...)
; 또는 적어도 그것이 내 코드의 한 부분을 찾은 것입니다.