2009-11-08 10 views
24

Obecnie struktura mojego kodu używa XmlDocument, aby załadować dane Xml, a następnie SelectNodes, aby przejrzeć listę powtarzających się elementów.Co to jest odpowiednik JSON.NET w XPath XML, SelectNodes, SelectSingleNode?

Dla każdego elementu używam XmlNode.SelectSingleNode, aby wybrać elementy pola.

Chcę teraz użyć JSON.NET, aby osiągnąć takie same wyniki z dokumentami dostarczonymi do mnie jako JSON. Odpowiedź może być inna niż JSON.net, pod warunkiem, że jest C# całkowalna.

Odpowiedz

34

Json.NET ma SelectToken. Używa składni podobnej do DataBinder.Eval aby uzyskać JSON poprzez wyrażenie tekstowe:

JObject o = JObject.Parse("{'People':[{'Name':'Jeff'},{'Name':'Joe'}]}"); 

// get name token of first person and convert to a string 
string name = (string)o.SelectToken("People[0].Name"); 

Lub jeśli chcesz wybrać wiele wartości:

JObject o = JObject.Parse("{'People':[{'Name':'Jeff','Roles':['Manager', 'Admin']}]}"); 

// get role array token of first person and convert to a list of strings 
IList<string> names = (string)o.SelectToken("People[0].Roles").Select(t => (string)t).ToList(); 

Dokumentacja: Querying JSON with SelectToken

+0

Nice! Czy istnieje sposób, aby to zrobić w sposób niewrażliwy na wielkość liter? Jak 'JToken.GetValue (" coś ", StringComparison.OrdinalIgnoreCase)'? –

1

Czy masz hierarchię obiektów, którą możesz odwzorować na JSON? Można utworzyć drzewo obiektów (np. Deserializować JSON) i użyć wartości LINQ: Where, SelectMany itd.

+0

Dzięki za odpowiedzi Marc. W szczególności Im korzystam z kanału twitter.com/status/mentions.json. Chcę przekazać każdy "status" do HTML Render bez znajomości (w czasie kompilacji), których pól używa i pozwolić na pobieranie pól za pomocą Jsonowej wersji SelectSingleNode. Przykład LINQ znacznie pomógłby :) –

+0

Ah, racja. Nie pozwoliłoby ci użyć dowolnego ciągu, jeśli o to ci chodzi. Wymagałoby to kodowania na scenariusz. –

Powiązane problemy