2017-02-17 3 views
2

Я работаю над разоблачением json-ответа HTTP с Json.NET и имеет рабочий код, но я уверен, что я об этом расскажу слишком сложным способом. Мой вопрос заключается в том, что существует более прямой способ получить ребенка jToken по пути и/или де-сериализовать его, не переуступая каждый уровень.Json.NET get inested jToken value

Я попробовал этот подход, но он возвращает нуль:

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

Вот мой работает слишком сложный код, в том числе Десериализации:

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 только для справки :

{ 
    "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-to-JSON для десериализации:

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

Образец fiddle.

В C# 6 или более поздней версии, вы можете использовать null conditional operator:

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

Или даже

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

Обратите внимание, что SelectTokens() слегка более либерален, чем JToken index operator как SelectTokens() возвратит нуль для запрос неправильного типа (например, если значение "response" было строковым литералом, а не вложенным объектом), в то время как оператор индекса генерирует исключение.

+0

Фантастический, и именно то, что я искал, спасибо! – edencorbin