2017-02-17 2 views
2

Ich arbeite bei der Analyse einer JSON HTTP-Antwort mit Json.NET und habe funktionierenden Code, aber bin mir ziemlich sicher, dass ich übermäßig kompliziert darüber gehe. Meine Frage ist, ob es einen direkteren Weg gibt, ein Kind durch Pfad jToken zu bekommen und/oder zu deserialisieren, ohne jede Ebene zu unterlaufen.Json.NET bekommen geschachtelt jToken Wert

habe ich versucht, diesen Ansatz, aber es gibt null zurück:

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

Hier ist meine übermäßig komplizierten Code arbeiten, einschließlich Deserialisierung:

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[]>(); 
      } 
     } 
     } 
    } 
    } 

Und hier ist die rohe Reaktion JSON nur als Referenz :

{ 
    "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"}] 
    }} 

Antwort

1

Sie SelectToken() ein Token auswählen können fro m tief in der LINQ-to-JSON-Hierarchie für die Deserialisierung:

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

Probe fiddle.

In C# 6 oder höher, können Sie die null conditional operator verwenden:

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

Oder sogar

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

Beachten Sie, dass SelectTokens() als die JToken index operator etwas toleranter ist, als SelectTokens() für eine Null zurück Abfrage des falschen Typs (z. B. wenn der Wert "response" ein Zeichenfolgenliteral und kein verschachteltes Objekt war), während der Indexoperator eine Ausnahme auslöst.

+0

Fantastisch, und genau das, was ich gesucht habe, danke! – edencorbin