2009-11-08 6 views
24

Actuellement, la structure de mon code utilise XmlDocument pour charger les données XML, puis SelectNodes pour parcourir une liste d'éléments récurrents.Quel est l'équivalent JSON.NET de XPath, SelectNodes, SelectSingleNode de XML?

Pour chaque élément, j'utilise XmlNode.SelectSingleNode pour sélectionner les éléments de champ. Je souhaite maintenant utiliser JSON.NET pour obtenir les mêmes résultats avec les documents qui me sont fournis en tant que JSON.

La réponse peut être autre chose que JSON.net, à condition que C# soit intégrable.

Répondre

34

Json.NET a SelectToken. Il utilise une syntaxe similaire à DataBinder.Eval pour obtenir JSON via une expression de chaîne:

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"); 

Ou si vous voulez sélectionner plusieurs valeurs:

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(); 

Documentation: Querying JSON with SelectToken

+0

Bien! Existe-t-il un moyen de le faire de manière insensible à la casse? Comme 'JToken.GetValue (" quelque chose ", StringComparison.OrdinalIgnoreCase)'? –

1

Avez-vous une hiérarchie d'objets pour mapper le JSON? Vous pouvez créer un arbre d'objets (c'est-à-dire désérialiser le JSON) et utiliser les Where, SelectMany de LINQ, etc.

+0

Merci pour la réponse Marc. Plus précisément, j'utilise le flux twitter.com/status/mentions.json. Je veux passer chaque "statut" à un rendu HTML sans savoir (au moment de la construction) quels champs il utilise et lui permettre de tirer des champs avec la version JSON de SelectSingleNode. Un exemple LINQ aiderait beaucoup :) –

+0

Ah, c'est vrai. Cela ne vous permettrait pas d'utiliser une chaîne arbitraire, si c'est ce que vous voulez dire. Il faudrait coder par scénario. –

Questions connexes