2012-10-23 14 views
5

Sto utilizzando la libreria NewtonSoft Json.NET per analizzare i file JSON in un'app .NET. Quello che devo fare è passare il nome di un nodo e ottenere il nodo se esiste, indipendentemente dal loro livello che è sconosciuto in anticipo.Cerca qualsiasi nodo in Json.NET

Per esempio in un file:

string json = @"{ 
    ""Name"": ""Apple"", 
    ""Expiry"": new Date(1230422400000), 
    ""Price"": 3.99, 
    ""ATest"": { 
    ""MyTest"": 
    [ 
     ""blah"", 
     ""blah"" 
    ] 
    } 
}"; 

C'è un modo di utilizzare solo il valore "MyTest" per andare a prendere quel nodo senza dover conoscere il nome del genitore come jObject["ATest"]["MyTest"][0]?

+0

Il JSON non è valido. 'Dimensioni 'è una matrice o un oggetto? E ti manca un '' 'in' Nome'. –

+0

sì, non era valido, mi dispiace, l'ho appena corretto, questo era solo un esempio, il vero JSON non ha importanza. Stavo solo cercando un modo per trovare un nodo a qualsiasi livello dato il suo nome – Alex

risposta

11

AFAIK non esiste una sintassi di query simile a XPath per JToken/JObject, ma è possibile crearne uno abbastanza facilmente: vedere il codice riportato di seguito.

public static class StackOverflow_13033174 
{ 
    public static void Test() 
    { 
     string json = @"{ 
          ""Name"": ""Apple"", 
          ""Expiry"": new Date(1230422400000), 
          ""Price"": 3.99, 
          ""ATest"": { 
          ""MyTest"": 
          [ 
           ""blah"", 
           ""blah"" 
          ] 
          } 
         }"; 

     JObject jo = JObject.Parse(json); 
     JToken myTest = jo.Descendants() 
      .Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "MyTest") 
      .Select(p => ((JProperty)p).Value) 
      .FirstOrDefault(); 
     Console.WriteLine(myTest); 
    } 
} 
+2

Se usi 'JObject.Parse' puoi usare il built-in [' JContainer.Descendants'] (http://james.newtonking.com/projects/json/help/index.html ? topic = html/M_Newtonsoft_Json_Linq_JContainer_Descendants.htm) metodo –

+0

Giusto, mi sono perso. Grazie! Aggiorneremo la risposta – carlosfigueira

+0

Che funziona perfettamente Grazie mille! – Alex