
Un fork de JSONPath issu de http://goessner.net/articles/JsonPath/
(voir aussi licences pour les dépendances de développement)
Analysez, transformez et extrayez sélectivement des données de documents JSON (et d'objets JavaScript).
jsonpath-plus étend la spécification d'origine en ajoutant quelques
opérateurs supplémentaires et explicite certains comportements que l'original
ne précisait pas.
Essayez la démo navigateur ou Runkit (Node).
Veuillez noter : ce projet n'est actuellement pas maintenu activement. Nous pouvons accepter des PR bien documentées ou quelques mises à jour simples, mais n'envisageons pas de corriger des bogues ni d'ajouter de nouvelles fonctionnalités nous-mêmes.
^ pour récupérer le parent d'un élément correspondant~ pour récupérer les noms de propriétés des éléments correspondants (sous forme de tableau)@null(), @boolean(), @number(), @string(), @array(), @object()@integer()@scalar() (qui accepte également undefined et
les nombres non finis lors de l'interrogation d'objets JavaScript, ainsi que tous les types de base non-objet/non-fonction)@other() utilisable en conjonction avec un otherTypeCallback défini par l'utilisateur@undefined(), @function(), @nonFinite())@path/@parent/@property/@parentProperty/@root dans les filtres` pour échapper la séquence restante@['...']/?@['...'] pour échapper les caractères spéciaux dans
les noms de propriétés au sein des filtres$.. (obtention de tous les composants parents)jsonpath-plus est régulièrement performant avec de grands comme de petits ensembles de données par rapport à d'autres bibliothèques d'interrogation JSON, selon json-querying-performance-testing. Vous pouvez vérifier ces résultats en exécutant le projet vous-même et en ajoutant d'autres cas de performance.
npm install jsonpath-plus
## Installation
### Node.js```js
const {JSONPath} = require('jsonpath-plus');
const result = JSONPath({path: '...', json});
Pour une utilisation dans le navigateur, vous pouvez inclure directement dist/index-browser-umd.cjs ; aucune
astuce Browserify n'est nécessaire :```html
### ESM (Navigateurs modernes)
Vous pouvez également utiliser les imports de modules ES6 (pour les navigateurs modernes):```html
<script type="module">
import {
JSONPath
} from './node_modules/jsonpath-plus/dist/index-browser-esm.js';
const result = JSONPath({path: '...', json: {}});
</script>
Ou si vous regroupez votre JavaScript (par exemple avec Rollup), utilisez simplement,
en notant que mainFields
devrait inclure browser pour les builds navigateur (pour Node, la valeur par défaut, qui
vérifie module, devrait convenir) :```js
import {JSONPath} from 'jsonpath-plus';
const result = JSONPath({path: '...', json});
## Utilisation
La signature complète disponible est:```
const result = JSONPath([options,] path, json, callback, otherTypeCallback);
Les arguments path, json, callback et otherTypeCallback
peuvent également être exprimés (avec toute autre propriété
disponible) sur options.
Notez que result contiendra tous les éléments trouvés (éventuellement
enveloppés dans un tableau), tandis que callback peut être utilisé si
vous souhaitez effectuer une opération à mesure que chaque élément est
découvert, la fonction de rappel étant exécutée 0 à N fois selon
le nombre d'éléments indépendants à trouver dans le résultat.
Consultez la documentation ci-dessous pour en savoir plus sur les arguments
disponibles de JSONPath.
Voir aussi la documentation de l'API.
Les propriétés qui peuvent être fournies sur l'objet options ou sur la
méthode evaluate (comme premier argument) incluent :
false,
on peut appeler la méthode evaluate manuellement.wrap est défini sur false et qu'aucun résultat n'est trouvé,
undefined sera renvoyé (par opposition à un tableau vide lorsque
wrap est défini sur true). Si wrap est défini sur false et qu'un seul
résultat non-tableau est trouvé, ce résultat sera le seul élément renvoyé
(pas dans un tableau). Un tableau sera toutefois toujours renvoyé si plusieurs
résultats sont trouvés. Pour éviter les ambiguïtés (dans le cas où
il est nécessaire de distinguer un résultat qui est un échec
d'un résultat qui est un tableau vide), il est recommandé de passer la
valeur par défaut à false.safe : dans le navigateur, utilise un moteur de script minimal qui n'utilise pas
eval ni Function et satisfait la politique de sécurité du contenu. Dans NodeJS,
il n'a aucun effet et équivaut à native car les scripts y sont sûrs.
native : utilise les capacités de script natives. c'est-à-dire eval ou
Function non sûrs dans le navigateur et vm.Script dans NodeJS.
false : désactive les expressions d'évaluation JavaScript et lève des exceptions
lorsque ces expressions sont tentées.
callback [ (code, context) => value] : une implémentation personnalisée appelée
avec code et context comme arguments pour renvoyer la valeur évaluée.
class : une classe créée avec comme argument de constructeur et le code
est évalué en appelant avec .
``parentProperty
de ce nœud racine d'être renvoyée dans les résultats. Il peut s'agir d'un nom
de propriété sous forme de chaîne ou d'un index de tableau numérique.resultType),
le type de la charge utile (qu'il s'agisse d'une "value" normale ou d'un nom de
"property"), et un objet de charge utile complet (avec tous les resultTypes).@other() à la fin de sa requête. Si un tel
chemin est rencontré, otherTypeCallback sera invoqué avec la
valeur de l'élément, son chemin, son parent et le nom de la propriété de son parent,
et il doit renvoyer un booléen indiquant si la valeur fournie
appartient au type "other" ou non (ou il peut gérer des transformations et
renvoyer false).autostart est définie sur false. Elle
peut être utilisée pour des évaluations répétées avec la même configuration.
Outre les propriétés listées, le second modèle de méthode peut
accepter n'importe laquelle des autres propriétés d'instance autorisées (à l'exception
de autostart qui n'aurait aucune pertinence ici).['$', 'aProperty', 'anotherProperty'].$['aProperty']['anotherProperty][0]. Les constructions terminales
~ et ^ de JSONPath et les opérateurs de type comme @string() sont
silencieusement supprimés./aProperty/anotherProperty/0
(avec les caractères internes ~ et / échappés conformément à la
spécification des pointeurs JSON). Les constructions terminales ~ et ^ de
JSONPath et les opérateurs de type comme @string() sont
silencieusement supprimés.Étant donné le JSON suivant, tiré de http://goessner.net/articles/JsonPath/ :```json { "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }
et la représentation XML suivante :```xml
<store>
<book>
<category>reference</category>
<author>Nigel Rees</author>
<title>Sayings of the Century</title>
<price>8.95</price>
</book>
<book>
<category>fiction</category>
<author>Evelyn Waugh</author>
<title>Sword of Honour</title>
<price>12.99</price>
</book>
<book>
<category>fiction</category>
<author>Herman Melville</author>
<title>Moby Dick</title>
<isbn>0-553-21311-3</isbn>
<price>8.99</price>
</book>
<book>
<category>fiction</category>
<author>J. R. R. Tolkien</author>
<title>The Lord of the Rings</title>
<isbn>0-395-19395-8</isbn>
<price>22.99</price>
</book>
<bicycle>
<color>red</color>
<price>19.95</price>
</bicycle>
</store>
Veuillez noter que les exemples XPath ci-dessous ne font pas de distinction entre la récupération des éléments et leur contenu textuel (sauf lorsque cela est utile pour des comparaisons ou pour éviter toute ambiguïté). Remarque : pour tester les exemples XPath (y compris ceux en 2.0), cette démo peut être utile (réglez sur xml ou xml-strict).| XPath | JSONPath | Résultat | Notes |
|---|---|---|---|
| /store/book/author | $.store.book[*].author | Les auteurs de tous les livres du magasin | Peut également être représenté sans $. comme store.book[*].author (bien que cela ne soit pas présent dans la spécification d'origine) ; notez que certains littéraux de caractères ($ et @) nécessitent un échappement, cependant |
| //author | $..author | Tous les auteurs | |
| /store/* | $.store.* | Tous les éléments du magasin, c'est-à-dire ses livres (un tableau de livres) et un vélo rouge (un objet vélo). | |
| /store//price | $.store..price | Le prix de tout ce qui se trouve dans le magasin. | |
| //book[3] | $..book[2] | Le troisième livre (objet livre) | |
| //book[last()] | $..book[(@.length-1)]
$..book[-1:] | Le dernier livre dans l'ordre. | Pour accéder à une propriété avec un caractère spécial, utilisez [(@['...'])] pour le filtre (cette fonctionnalité particulière n'est pas présente dans la spécification d'origine) |
| //book[position()<3] | $..book[0,1]
$..book[:2] | Les deux premiers livres | |
| //book/*[self::category\|self::author] or //book/(category,author) in XPath 2.0 | $..book[0][category,author] | Les catégories et les auteurs de tous les livres | |
| //book[isbn] | $..book[?(@.isbn)] | Filtre tous les livres avec un numéro ISBN | Pour accéder à une propriété avec un caractère spécial, utilisez [?@['...']] pour le filtre (cette fonctionnalité particulière n'est pas présente dans la spécification d'origine) |
| //book[price<10] | $..book[?(@.price<10)] | Filtre tous les livres moins chers que 10 | |
| //*[name() = 'price' and . != 8.95] | $..*[?(@property === 'price' && @ !== 8.95)] | Obtient toutes les valeurs de propriété des objets dont la propriété est price et qui ne sont pas égales à 8,95 | Avec le @ seul permettant de filtrer les objets par valeur de propriété (pas nécessairement dans des tableaux), vous pouvez ajouter ^ après l'expression pour obtenir l'objet possédant les propriétés filtrées |
| / | $ | La racine de l'objet JSON (c'est-à-dire l'objet entier lui-même) | Pour obtenir un $ littéral (seul ou n'importe où dans le chemin), vous devez utiliser l'échappement par accent grave |
| //*/*\|//*/*/text() | $..* | Tous les éléments (et le texte) sous la racine d'un document XML. Tous les membres d'une structure JSON sous la racine. | |
| //* | $.. | Tous les éléments d'un document XML. Tous les composants parents d'une structure JSON, y compris la racine. | Ce comportement n'était pas directement spécifié dans la spécification d'origine |
| //*[price>19]/.. | $..[?(@.price>19)]^ | Parent des éléments spécifiques dont le prix est supérieur à 19 (c'est-à-dire la valeur du magasin comme parent du vélo et le tableau de livres comme parent d'un livre individuel) | Parent (caret) non présent dans la spécification d'origine |
| /store/*/name() (in XPath 2.0) | $.store.*~ | Les noms de propriétés du sous-objet du magasin ("book" et "bicycle"). Utile avec les propriétés génériques. | Nom de propriété (tilde) non présent dans la spécification d'origine |
| /store/book[not(. is /store/book[1])] (in XPath 2.0) | $.store.book[?(@path !== "$['store']['book'][0]")] | Tous les livres sauf celui situé au chemin pointant vers le premier | @path n'est pas présent dans la spécification d'origine |
| //book[parent::*/bicycle/color = "red"]/category | $..book[?(@parent.bicycle && @parent.bicycle.color === "red")].category | Récupère toutes les catégories de livres où l'objet parent du livre a un enfant vélo dont la couleur est rouge (c'est-à-dire tous les livres) | @parent n'est pas présent dans la spécification d'origine |
| //book/*[name() != 'category'] | $..book.*[?(@property !== "category")] | Récupère tous les enfants de "book" sauf ceux de type "category" | @property n'est pas présent dans la spécification d'origine |
| //book[position() != 1] | $..book[?(@property !== 0)] | Récupère tous les livres dont la propriété (qui, étant donné que nous atteignons l'intérieur d'un tableau, est l'index numérique) n'est pas 0 | @property n'est pas présent dans la spécification d'origine |
| /store/*/*[name(parent::*) != 'book'] | $.store.*[?(@parentProperty !== "book")] | Récupère les petits-enfants du magasin dont la propriété parente n'est pas book (c'est-à-dire les enfants du vélo, "color" et "price") | @parentProperty n'est pas présent dans la spécification d'origine |
| //book[count(preceding-sibling::*) != 0]/*/text() | $..book.*[?(@parentProperty !== 0)] | Obtient les valeurs de propriété de toutes les instances de livre où la propriété parente de ces valeurs (c'est-à-dire l'index du tableau contenant l'objet parent de l'élément livre) n'est pas 0 | @parentProperty n'est pas présent dans la spécification d'origine |
| //book[price = /store/book[3]/price] | $..book[?(@.price === @root.store.book[2].price)] | Filtre tous les livres dont le prix est égal au prix du troisième livre | @root n'est pas présent dans la spécification d'origine |
| //book/../*[. instance of element(*, xs:decimal)] (in XPath 2.0) | $..book..*@number() | Obtient les valeurs numériques dans le tableau de livres | @number(), les autres types de base (@boolean(), @string()), les autres types dérivés de bas niveau (@null(), @object(), @array()), le type ajouté par JSONSchema, @integer(), le type composé @scalar() (qui accepte également undefined et les nombres non finis pour les objets JavaScript ainsi que tous les types de base non objet/non fonction), le type @other(), à utiliser en conjonction avec un callback défini par l'utilisateur (voir otherTypeCallback) et les types non-JSON suivants qui peuvent néanmoins être utilisés avec JSONPath lors de l'interrogation d'objets JavaScript non-JSON (@undefined(), @function(), @nonFinite()) ne sont pas présents dans la spécification d'origine |
| //book/*[name() = 'category' and matches(., 'tion$')] (XPath 2.0) | $..book.*[?(@property === "category" && @.match(/TION$/i))] | Toutes les catégories de livres qui correspondent à l'expression régulière (se terminent par 'TION' sans tenir compte de la casse) | @property n'est pas présent dans la spécification d'origine. |
| //book/*[matches(name(), 'bn$')]/parent::* (XPath 2.0) | $..book.*[?(@property.match(/bn$/i))]^ | Tous les livres qui ont une propriété correspondant à l'expression régulière (se terminent par 'TION' sans tenir compte de la casse) | @property n'est pas présent dans la spécification d'origine. Remarque : utilise le sélecteur parent ^ à la fin de l'expression pour revenir à l'objet parent ; sans le sélecteur parent, il correspond aux deux valeurs de clé isbn. |
| | ` (par exemple, `$ pour correspondre à une propriété littéralement nommée $) | Échappe toute la séquence suivante (pour être traitée comme un littéral) | ` n'est pas présent dans la spécification d'origine ; pour obtenir un accent grave littéral, utilisez un accent grave supplémentaire pour l'échapper |Toutes les variables supplémentaires fournies en tant que propriétés de l'option d'objet
facultative « sandbox » sont également disponibles pour les évaluations
(basées sur des parenthèses).
@ soit une
référence à ses enfants, sélectionne en réalité les enfants immédiats
également, alors qu'en XPath, les conditions de filtre ne sélectionnent pas les enfants
mais délimitent lesquels de ses nœuds parents seront obtenus dans le résultat.Une interface en ligne de commande (CLI) de base est fournie. Accédez-y en utilisant npx jsonpath-plus <json-file> <jsonpath-query>.
|) et le regroupement.Exécution des tests sur Node :```shell npm test
Pour les tests dans le navigateur :
- Servez les fichiers js/html :```shell
npm run browser-test
Veuillez consulter SECURITY.md pour des considérations de sécurité importantes et des instructions sur la manière de signaler des vulnérabilités.
coderunInNewContextcontext