2017-02-17 1 views
2

Json.NET을 사용하여 json http 응답을 구문 분석하고 작업중인 코드가 있지만 지나치게 복잡한 방식으로이 코드를 작성하려고합니다. 내 질문은 경로를 통해 자식 jToken을 가져 오는 더 직접적인 방법이 있거나 모든 수준을 경고하지 않고 역 직렬화하는 경우입니다. Json.NET은 중첩 된 jToken 값을 얻습니다.

나는이 방법을 시도했지만는 null를 돌려 :

JObject jObj = JObject.Parse(text); 

    foreach(var kv in jObj) { 
    if(kv.Key == "response") { 
     foreach(JToken jt in kv.Value) { 
     if(jt.Path == "response.docs") { 
      JEnumerable<JToken> children = jt.Children(); 
      foreach(JToken t in children) {  
      //THIS WORKS BUT IS NOT ELEGANT 
      Solr_User[] su = t.ToObject<Solr_User[]>(); 
      } 
     } 
     } 
    } 
    } 

그리고 여기 단지 참조를 위해 JSON 원시 응답입니다 : 여기

JObject jObj = JObject.Parse(text); 
    JToken myVal; 
    jObj.TryGetValue("response.docs", out myVal); 

내이 해제 직렬화를 포함하여 지나치게 복잡한 코드를 작동 :

{ 
    "responseHeader":{ 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"*:*", 
     "indent":"on", 
     "wt":"json"}}, 
    "response":{"numFound":4,"start":0,"docs":[ 
     { 
     "id":3, 
     "first_name":"Bob", 
     "_version_":"1558902640594649088"}, 
     { 
     "id":4, 
     "first_name":"Sam", 
     "_version_":"1558902640613523456"}, 
     { 
     "id":2, 
     "first_name":"Fred", 
     "_version_":"1558902640613523457"}, 
     { 
     "id":1, 
     "first_name":"Max", 
     "_version_":"1558902640613523458"}] 
    }} 

답변

1

당신은 토큰을 이리저리 선택 SelectToken()을 사용할 수 있습니다 직렬화에 대한 LINQ - 투 - JSON 계층 구조 내에서 m의 깊이 :

var su = (jObj.SelectToken("response.docs") ?? JValue.CreateNull()).ToObject<Solr_User []>(); 

샘플 fiddle. SelectTokens()SelectTokens()에 대한 null를 돌려 바와 같이, JToken index operator보다 약간 더 관대이라고

var su = jObj.SelectToken("response.docs")?.ToObject<Solr_User []>(); 

심지어

var su = jObj?["response"]?["docs"]?.ToObject<Solr_User []>(); 

참고 :

C# 6에서

이상, 당신은 null conditional operator을 사용할 수 있습니다 잘못된 유형의 쿼리 (예 : "response"의 값이 중첩 된 객체가 아닌 문자열 리터럴 인 경우) 인덱스 연산자가 예외를 throw합니다.

+0

환상적이고 정확하게 내가 찾고 있었던 것, 감사합니다! – edencorbin