2012-10-23 5 views
5

herhangi bir düğüm Yukarı Bak. Ne yapmak gerek bakılmaksızın önceden bilinmeyen onların seviyesinin, bir düğümün adını geçirmek ve varsa düğümü elde etmektir. Bir dosyada Örneğin Bir .NET uygulamasında JSON dosyalarını ayrıştırmak için NewtonSoft Json.NET kitaplığı kullanıyorum Json.NET

:

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

sadece jObject["ATest"]["MyTest"][0] gibi ebeveynin adını bilmek zorunda kalmadan bu düğümü getirmek için değer "MyTest" kullanmak için bir yolu var mı?

+0

JSON'unuz geçersiz. 'Bir dizi ya da bir nesneyi Sizes' mi? Ve eksik bir '" '' in Name'. –

+0

evet öyleydi geçersiz, üzgünüm. Ben sadece düzeltildi. Yani, gerçek JSON Sadece bulmak için bir yol arıyordu. Önemli değil sadece bir örnekti node herhangi bir düzeyde adı verilen – Alex

cevap

11

AFAIK JToken/JObject için XPath benzeri sorgu sözdizimi yoktur, ancak oldukça kolay bir tane yapabilirsiniz - aşağıdan aşağıya bakın.

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

Eğer "JObject.Parse" kullanırsanız, yerleşik ['JContainer.Descendants'] kullanabilirsiniz (http://james.newtonking.com/projects/json/help/index.html ? topic = html/M_Newtonsoft_Json_Linq_JContainer_Descendants.htm) metodu –

+0

Doğru, bunu özledim. Teşekkürler! Cevabı güncelleştirir – carlosfigueira

+0

Mükemmel çalışır.Çok teşekkür ederim! – Alex