Lorsque vous recherchez des éléments dans des tableaux et hachages JSON complexes, comme:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Existe-t-il une sorte de langage de requête que je peux utiliser pour trouver un article in [0].objects where id = 3
?
javascript
json
xpath
xquery
Naftuli Kay
la source
la source
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
qui contient votre objet JSON, vous écririez :jsel(data).select("//*[@id=3]")
et cela retournerait l'objet contenant la clé id avec 3.Réponses:
Oui, ça s'appelle JSONPath . La source est maintenant sur GitHub .
Il est également intégré à DOJO .
la source
Je pense que JSONQuery est un sur-ensemble de JSONPath et le remplace donc dans dojo . Ensuite, il y a aussi RQL .
De la documentation Dojo:
JSONselect a un autre point de vue sur la question (comme un sélecteur CSS, plutôt que XPath) et a une implémentation JavaScript .
la source
D'autres alternatives que je connais sont
HTH.
la source
Pour résumer certaines des options actuelles de traversée / filtrage des données JSON, et fournir quelques exemples de syntaxe ...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select () (inspiré plus des sélecteurs CSS)
.automobiles .maker:val("Honda") .model
JSONPath (inspiré plus par XPath)
$.automobiles[?(@.maker='Honda')].model
Je pense que JSPath est le plus joli, donc je vais essayer de l'intégrer avec mon application AngularJS + CakePHP.
(J'ai initialement publié cette réponse dans un autre sujet, mais j'ai pensé qu'elle serait utile ici également.)
la source
Essayez d'utiliser JSPath
JSPath est un langage spécifique au domaine (DSL) qui vous permet de naviguer et de trouver des données dans vos documents JSON. À l'aide de JSPath, vous pouvez sélectionner des éléments de JSON afin de récupérer les données qu'ils contiennent.
JSPath pour JSON comme un XPath pour XML.
Il est fortement optimisé à la fois pour Node.js et les navigateurs modernes.
la source
XQuery peut être utilisé pour interroger JSON, à condition que le processeur offre une prise en charge JSON. Voici un exemple simple d'utilisation de BaseX pour rechercher des objets avec "id" = 1:
la source
JQ définit un J SON q langage uery qui est très similaire à JSONPath - voir https://github.com/stedolan/jq/wiki/For-JSONPath-users
Je suppose que cela signifie: recherchez tous les objets JSON sous la clé spécifiée avec id == 3, peu importe où l'objet peut être. Une requête jq correspondante serait:
où "|" est l'opérateur pipe (comme dans les pipes shell de commande), et où le segment ".. | objets" correspond à "peu importe où l'objet peut être".
Les bases de jq sont largement évidentes ou intuitives ou du moins assez simples, et la plupart du reste est facile à comprendre si vous êtes familier avec les canaux de shell de commande. La FAQ jq contient des pointeurs vers des didacticiels et autres.
jq est également similaire à SQL en ce qu'il prend en charge les opérations CRUD, bien que le processeur jq n'écrase jamais son entrée. jq peut également gérer des flux d'entités JSON.
Deux autres critères que vous souhaiterez peut-être prendre en compte pour évaluer un langage de requête orienté JSON sont:
la source
Defiant.js a également l'air plutôt cool, voici un exemple simple:
la source
Json Pointer semble également obtenir un soutien croissant.
la source
Jsel est génial et est basé sur un véritable moteur XPath. Il vous permet de créer des expressions XPath pour trouver n'importe quel type de données JavaScript, pas seulement des objets (des chaînes aussi).
Vous pouvez créer des schémas et des mappages personnalisés pour vous donner un contrôle complet sur la façon dont vos données peuvent être parcourues par le moteur XPath. Un schéma est un moyen de définir la façon dont les éléments, les enfants, les attributs et les valeurs des nœuds sont définis dans vos données. Ensuite, vous pouvez créer vos propres expressions en fonction.
Étant donné que vous avez appelé une variable
data
qui contient le JSON de la question, vous pouvez utiliser jsel pour écrire:Cela renverra n'importe quel nœud avec un
id
attribut de 3. Un attribut est une valeur primitive (chaîne, nombre, date, expression régulière) dans un objet.la source
ObjectPath est un langage de requête similaire à XPath ou JSONPath, mais beaucoup plus puissant grâce aux calculs arithmétiques intégrés, aux mécanismes de comparaison et aux fonctions intégrées. Voir la syntaxe:
Retrouvez dans la boutique toutes les chaussures de couleur rouge et prix inférieur à 50
$ .. chaussures. * [la couleur est "rouge" et prix <50]
la source
@Naftule - avec "defiant.js", il est possible d'interroger une structure JSON avec des expressions XPath. Consultez cet évaluateur pour avoir une idée de son fonctionnement:
http://www.defiantjs.com/#xpath_evaluator
Contrairement à JSONPath, "defiant.js" offre la prise en charge à grande échelle de la syntaxe de requête - de XPath sur les structures JSON.
Le code source de defiant.js peut être trouvé ici:
https://github.com/hbi99/defiant.js
la source
JMESPath semble être très populaire de nos jours (à partir de 2020) et résout un certain nombre de problèmes avec JSONPath. Il est disponible dans de nombreuses langues.
la source
Si vous êtes comme moi et que vous voulez simplement faire des recherches basées sur le chemin, mais que vous ne vous souciez pas du vrai XPath, lodash
_.get()
peut fonctionner. Exemple de documents lodash:la source
Essayez ceci - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
C'est une implémentation très simple sur une ligne similaire de xpath pour xml. Ce sont des noms comme jpath.
la source