2014-04-09 1 views
0

응답의 각 배열 이름을 알 수없는 Json Response에서 모든 배열을 추출하는 방법이 있습니까?JSON JObject 다중 배열 객체 감지

기본적으로 JSON의 배열 객체 수를 감지하고 각 객체에 개별적으로 액세스하려고합니다.

저는이 작업을 동적으로 수행하므로 하나의 응답에만 "직원"배열 만 포함될 수 있으며 다음 응답에는 둘 다 포함될 수 있습니다. 두 배열의 구조는 항상 동일하게 유지됩니다. 모든

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

답변

0

첫째, 귀하의 성명에 따라, 두 배열의 구조로 항상 우리가 List<FullName>로 구조를 정의 할 수 있습니다, 동일하게 유지됩니다; 당신이 사전에 응답 각 배열의 이름을 알고하지 않는 한,

public class FullName 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 
} 

, 그 두 번째를 주어, Dictionary 같은 데이터 구조를 임명 할 수있다.

휘 키 (Fyki), 여기서는 Json.Net을 사용하고 있습니다. 따라서 미리 참조를 추가하는 것을 잊지 마십시오.

아래의 코드를 참조하십시오 dictCategoryList 유형 Dictionary<string, List<FullName>>이다

// 'json' is in enquoted string format 
string json = "{\"employees\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}],\"employers\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}]}"; 

var dictCategoryList = JsonConvert.DeserializeObject<Dictionary<string, List<FullName>>>(json); 

합니다. 이런 식으로

, 당신은 단지 JSON의 배열 개체의 수를 감지하는 dictCategoryList.Count를 사용해야하고 개별적으로 각각의 액세스 다음과 같은 :

foreach (var category in dictCategoryList) 
{ 
    foreach (var item in category.Value) 
    { 
     Console.WriteLine(string.Format("First Name: {0}, Last Name: {1}", item.firstName, item.lastName)); 
    } 
} 
+0

감사합니다! 지금 이걸 시험해 보러 갈거야. – Derek

1

이 작업을 수행하는 쉬운 방법이있는 수업을 만드는 것을 포함하지 않습니다.

jObject/JArray (귀하의 경우 jObject)를 사용하고 JObject.Parse를 사용하면 JObject를 반환 할 수 있습니다. 그것은 파싱 된 json에서 생성 된 트리 구조입니다.

아마도 변화하는 요구에 맞는 수업을 만드는 것보다 편안 할 것입니다. 또한 키를 탐색하는 구문과 같은 xpath가 있습니다.

업데이트 : 조언에 대한

var so = "{\"employees\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}],\"employers\": [{\"firstName\": \"John\",\"lastName\": \"Doe\"},{\"firstName\": \"Anna\",\"lastName\": \"Smith\"},{\"firstName\": \"Peter\",\"lastName\": \"Jones\"}]}"; 
var parsed = JObject.Parse(so); 
foreach (KeyValuePair<string, JToken> pair in parsed) 
{ 
    Debug.WriteLine(pair.Key); 
    foreach (JToken childObject in pair.Value) 
    { 
     Debug.WriteLine(childObject["firstName"]); 
     Debug.WriteLine(childObject["lastName"]); 
    } 
} 

    // Or with Syntax i talked about: 
foreach (var token in parsed.SelectTokens("employees/")) 
{ 
    Debug.WriteLine(token["firstName"]); 
    Debug.WriteLine(token["lastName"]); 
} 
+0

일단 JObject에 대한 응답을 파싱했다면 어떻게 2 개의 배열을 꺼내나요? – Derek

+0

샘플을 수정하겠습니다. 잠시만 기다려주세요. – Dbl

+0

고마워요, 이것 좀보세요. – Derek