2014-01-30 5 views
0

제 3 자의 JSON 피드를 소비하는 방법을 쓰려고하지만 유감스럽게도 잘 작성되지 않았으며 때로는 존재하지 않는 것에 대한 규칙도없고 구조에 따라 변경됩니다 열쇠에, 나는 우리가 가지고있는 것과 함께 일해야만하는 이것을 바꿀 수있는 방법이 없습니다. 우리는 특정 키를 기반으로 원하는 것을 알고 있지만 중첩 된 구조가 변경되면이를 찾기 위해 고심하고 있습니다.알 수없는 구조의 JSON 쿼리

{ 
    "employees": [ 
    { "firstName":"John" , "lastName":"Doe" }, 
    { "firstName":"Anna" , "lastName":"Smith" }, 
    { "firstName":"Peter" , "lastName":"Jones" } 
    ] 
} 

가 키 목록 될 것입니다 :

는 우리가 조회 할 수 있습니다 다음과 같은 JSON 때문에 키가 부모를 포함한 완전한 이름이 될 것이라고> 하나의 목록 아래로 JSON을 평평하게하는 것이 가능 같은 :

"employees.firstName" and a value of "John". 

나는 우리가이 얻을 수 있다면 우리는 우리가 원하는에 대한 데이터를 조회 할 수 있다고 생각, 우리는 동적 객체를 사용하려고 왔지만 나는 JSON 변화와 특성이 가끔 누락하고 증명하는 것 말했듯 모든 시나리오를 처리하는 것은 불가능합니다.

+0

당신이 dictionary''의 모든 JSON을 구문 분석 할 수 있습니다 "]''John"입니다. – Grundy

+0

이것은 매우 단순화 된 해결책이었습니다. 불행히도 우리가 얻고있는 JSON은 때때로 10 개의 레이어가 중첩되어 있으며, 내가 말했듯이 우리는 항상 어떻게 보이는지 알 수는 없지만 속성 이름은 우리가 "level1.level2.level3.level4.level5.firstName"과 같은 키를 가진 문자열을 얻을 수 있다면 "firstName"을 쿼리 할 수 ​​있습니다. – user351711

+0

당신은 [JObject] (http://james.newtonking.com/json/help/index.html?topic=html/T_Newtonsoft_Json_Linq_JObject.htm)와 JSON.Net – Grundy

답변

0

JSON의 구조를 확실하게 알지 못하더라도 "firstName"이라는 속성 이름이 확실한 경우 JSON.NET JObject를 사용하고 재귀 적으로 반복하여 찾고있는 속성이 현재 JToken에 있는지 확인할 수 있습니다.

나는 그것이 타이핑 실수 할 수 있습니다 컴파일되지 않은 코드주의, 그처럼 보일 것이다 코드 : 당신이 할 수있는`직원 [ "firstName을 수 있도록

private List<string> LoadFirstNames(string json) 
{ 
    JObject o = JObject.Parse(json); 
    List<string> firstNames = new List<string>(); 
    foreach(var token in o.GetPropertyValues()) 
    { 
    FindFirstName(token, firstNames); 
    } 

    return firstNames; 
} 

private void FindFirstName(JToken currentProperty, List<string> firstNamesCollection) 
{ 
    if(currentProperty == null) 
    { 
    return; 
    } 

    if(currentProperty["firstName"] != null) 
    { 
     firstNamesCollection.Add(currentProperty["firstName"]); 
    } 

    foreach(var token into currentProperty.Values()) 
    { 
    FindFirstName(token , firstNamesCollection); 
    } 

} 
+0

에 대해 알 수 있습니다. 값이 null인지 검사 할 때 여전히 예외를 얻고 있었고 동적 객체가 없으므로 try ... catch를 래핑하고 오류가 있으면 false를 반환하는 메서드를 만들어야했습니다. – user351711

관련 문제