
Un fork de JSONPath de http://goessner.net/articles/JsonPath/
(ver también licencias para dependencias de desarrollo)
Analiza, transforma y extrae selectivamente datos de documentos JSON (y objetos de JavaScript).
jsonpath-plus expande la especificación original para añadir algunos
operadores adicionales y hace explícitos algunos comportamientos que la original
no detallaba.
Prueba la demo en el navegador o Runkit (Node).
Nota: Este proyecto no se mantiene activamente en la actualidad. Podemos aceptar PRs bien documentados o algunas actualizaciones simples, pero no buscamos hacer correcciones ni añadir nuevas funciones por nuestra cuenta.
^ para obtener el padre de un elemento coincidente~ para obtener los nombres de propiedad de los elementos coincidentes (como array)@null(), @boolean(), @number(), @string(), @array(), @object()@integer()@scalar() (que también acepta undefined y
números no finitos al consultar objetos de JavaScript, así como todos los tipos básicos no objeto/no función)@other() utilizable junto con un definido por el usuariojsonpath-plus es consistentemente eficiente con conjuntos de datos tanto grandes como pequeños en comparación con otras librerías de consulta JSON según json-querying-performance-testing. Puedes verificar estos hallazgos ejecutando el proyecto tú mismo y añadiendo más casos de rendimiento.
npm install jsonpath-plus
## Configuración
### Node.js```js
const {JSONPath} = require('jsonpath-plus');
const result = JSONPath({path: '...', json});
Para uso en navegador puedes incluir directamente dist/index-browser-umd.cjs; no
es necesaria ninguna magia de Browserify:```html
### ESM (Navegadores modernos)
También puedes usar importaciones de módulos ES6 (para navegadores modernos):```html
<script type="module">
import {
JSONPath
} from './node_modules/jsonpath-plus/dist/index-browser-esm.js';
const result = JSONPath({path: '...', json: {}});
</script>
O si estás empaquetando tu JavaScript (p. ej., con Rollup), solo usa,
ten en cuenta que mainFields
debe incluir browser para las compilaciones del navegador (para Node, la opción predeterminada, que
verifica module, debería ser suficiente):```js
import {JSONPath} from 'jsonpath-plus';
const result = JSONPath({path: '...', json});
## Uso
La firma completa disponible es:```
const result = JSONPath([options,] path, json, callback, otherTypeCallback);
Los argumentos path, json, callback y otherTypeCallback
pueden expresarse alternativamente (junto con cualquier otra de las
propiedades disponibles) en options.
Tenga en cuenta que result contendrá todos los elementos encontrados (opcionalmente
envueltos en un array) mientras que callback puede utilizarse si
desea realizar alguna operación a medida que se descubre cada elemento, con
la función de callback ejecutándose de 0 a N veces dependiendo
del número de elementos independientes que se encuentren en el resultado.
Consulte la documentación a continuación para más información sobre los argumentos disponibles de JSONPath.
Véase también la documentación de la API.
Las propiedades que se pueden suministrar en el objeto de opciones o en el método evaluate (como primer argumento) incluyen:
false,
se puede llamar manualmente al método evaluate.wrap se establece en false y no se encuentran resultados,
se devolverá undefined (en lugar de un array vacío cuando
wrap se establece en true). Si se establece en y se encuentra un único
resultado que no sea un array, ese resultado será el único elemento devuelto
(no dentro de un array). No obstante, se seguirá devolviendo un array si se encuentran
múltiples resultados. Para evitar ambigüedades (en el caso en que
sea necesario distinguir entre un resultado que es un fallo
y uno que es un array vacío), se recomienda cambiar el
valor por defecto a .autostart está establecida en false. Se
puede utilizar para evaluaciones repetidas usando la misma configuración.
Además de las propiedades enumeradas, el último patrón de método puede
aceptar cualquiera de las otras propiedades de instancia permitidas (excepto
autostart, que no tendría relevancia aquí).['$', 'aProperty', 'anotherProperty'].$['aProperty']['anotherProperty][0]. Las construcciones terminales
de JSONPath ~ y ^ y los operadores de tipo como @string() se
eliminan silenciosamente./aProperty/anotherProperty/0
(con cualquier carácter interno ~ y / escapado según la
especificación de JSON Pointer). Las construcciones terminales de JSONPath ~ y ^ y
los operadores de tipo como se eliminan silenciosamente.Dado el siguiente JSON, tomado 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 } } }
y la siguiente representación XML:```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>
Tenga en cuenta que los ejemplos de XPath a continuación no distinguen entre
recuperar elementos y su contenido de texto (excepto cuando es útil para
comparaciones o para evitar ambigüedades). Nota: para probar los ejemplos de XPath
(incluidos los de 2.0), esta demo
puede ser útil (configúrelo en xml o xml-strict).| XPath | JSONPath | Resultado | Notas |
|-------------------------------------------------------------------------------------|---------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /store/book/author | $.store.book[*].author | Los autores de todos los libros de la tienda | También puede representarse sin el $. como store.book[*].author (aunque esto no está presente en la especificación original); nótese que algunos literales de carácter ($ y @) requieren escape, sin embargo |
| | | Todos los autores | |
| | | Todas las cosas en la tienda, que son sus libros (un array de libros) y una bicicleta roja (un objeto bicicleta). | |
| | | El precio de todo en la tienda. | |
| | | El tercer libro (objeto libro) | |
| | | El último libro en orden. | Para acceder a una propiedad con un carácter especial, utiliza para el filtro (esta característica en particular no está presente en la especificación original) |
| | | Los dos primeros libros | |
| o en XPath 2.0 | | Las categorías y autores de todos los libros | |
| | | Filtrar todos los libros que tengan un número ISBN | Para acceder a una propiedad con un carácter especial, utiliza para el filtro (esta característica en particular no está presente en la especificación original) |
| | | Filtrar todos los libros más baratos que 10 | |
| | | Obtener todos los valores de propiedad de objetos cuya propiedad es price y que no sean iguales a 8.95 | Con el solo que permite filtrar objetos por valor de propiedad (no necesariamente dentro de arrays), puedes añadir después de la expresión para obtener el objeto que posee las propiedades filtradas |
| | | La raíz del objeto JSON (es decir, el objeto completo en sí mismo) | Para obtener un literal (solo o en cualquier parte de la ruta), debes usar el escape de comilla invertida |
| | | Todos los Elementos (y texto) debajo de la raíz en un documento XML. Todos los miembros de una estructura JSON debajo de la raíz. | |
| | | Todos los Elementos en un documento XML. Todos los componentes padre de una estructura JSON incluyendo la raíz. | Este comportamiento no fue especificado directamente en la especificación original |
| | | Padre de aquellos elementos específicos con un precio mayor que 19 (es decir, el valor de la tienda como padre de la bicicleta y el array de libros como padre de un libro individual) | El padre (caret) no está presente en la especificación original |
| (en XPath 2.0) | | Los nombres de propiedad del subobjeto de la tienda («book» y «bicycle»). Útil con propiedades comodín. | El nombre de propiedad (tilde) no está presente en la especificación original |
| (en XPath 2.0) | | Todos los libros excepto el que se encuentra en la ruta que apunta al primero | no está presente en la especificación original |
| | | Obtiene todas las categorías de libros donde el objeto padre del libro tiene un hijo bicicleta cuyo color es rojo (es decir, todos los libros) | no está presente en la especificación original |
| | | Obtiene todos los hijos de «book» excepto los de «category» | no está presente en la especificación original |
| | | Obtiene todos los libros cuya propiedad (que, al estar dentro de un array, es el índice numérico) no sea 0 | no está presente en la especificación original |
| | | Obtiene los nietos de la tienda cuya propiedad padre no es book (es decir, los hijos de la bicicleta, «color» y «price») | no está presente en la especificación original |
| | | Obtiene los valores de propiedad de todas las instancias de libro donde la propiedad padre de estos valores (es decir, el índice del array que contiene el objeto padre del elemento libro) no sea 0 | no está presente en la especificación original |
| | | Filtrar todos los libros cuyo precio sea igual al precio del tercer libro | no está presente en la especificación original |
| (en XPath 2.0) | | Obtener los valores numéricos dentro del array de libros | , los otros tipos básicos (, ), otros tipos derivados de bajo nivel (, , ), el tipo añadido por JSONSchema, , el tipo compuesto (que también acepta y números no finitos para objetos JavaScript, así como todos los tipos básicos no objeto/no función), el tipo , para usarse junto con un callback definido por el usuario (ver ), y los siguientes tipos no JSON que pueden usarse no obstante con JSONPath al consultar objetos JavaScript no JSON (, , ) no están presentes en la especificación original |
| (XPath 2.0) | | Todas las categorías de libros que coinciden con la expresión regular (terminan en 'TION' sin distinguir mayúsculas de minúsculas) | no está presente en la especificación original. |
| (XPath 2.0) | | Todos los libros que tienen una propiedad que coincide con la expresión regular (terminan en 'TION' sin distinguir mayúsculas de minúsculas) | no está presente en la especificación original. Nota: Usa el selector de padre al final de la expresión para volver al objeto padre; sin el selector de padre, coincide con los dos valores de clave . |
| | (e.g., to match a property literally named ) | Escapa toda la secuencia siguiente (para que se trate como un literal) | no está presente en la especificación original; para obtener una comilla invertida literal, usa una comilla invertida adicional para escapar |Cualquier variable adicional proporcionada como propiedades de la opción de objeto opcional "sandbox" también está disponible para evaluaciones (basadas en paréntesis).
@ sea una referencia a sus hijos, en realidad también selecciona los hijos inmediatos, mientras que en XPath, las condiciones de filtro no seleccionan los hijos sino que delimitan cuáles de sus nodos padres se obtendrán en el resultado.Se proporciona una interfaz básica de línea de comandos (CLI). Accede a ella usando npx jsonpath-plus <json-file> <jsonpath-query>.
|) y agrupación.Ejecutar las pruebas en Node:```shell npm test
Para pruebas en el navegador:
- Sirve los archivos js/html:```shell
npm run browser-test
Consulta SECURITY.md para conocer las consideraciones de seguridad importantes y las instrucciones sobre cómo reportar vulnerabilidades.
otherTypeCallback@undefined(), @function(), @nonFinite())@path/@parent/@property/@parentProperty/@root selectores abreviados dentro de filtros` para escapar la secuencia restante@['...']/?@['...'] para escapar caracteres especiales dentro de
nombres de propiedad en filtros$.. (obtener todos los componentes padre)wrapfalsefalsesafe: En el navegador, utilizará un motor de scripting mínimo que no usa
eval ni Function y cumple con la Política de Seguridad de Contenido. En NodeJS,
no tiene efecto y es equivalente a native, ya que allí el scripting es seguro.
native: utiliza las capacidades nativas de scripting; es decir, eval o
Function inseguros en el navegador y vm.Script en nodejs. false: Desactiva
las expresiones de evaluación de JavaScript y lanza excepciones cuando se intentan utilizar.
callback [ (code, context) => value]: Una implementación personalizada que se llama
con code y context como argumentos para devolver el valor evaluado.
class: Una clase que se crea con code como argumento del constructor y el código
se evalúa llamando a runInNewContext con context.
``parentProperty
de ese nodo raíz se devuelva dentro de los resultados. Esta puede ser un nombre
de propiedad de tipo cadena o un índice numérico de array.resultType),
el tipo del payload (ya sea un "value" normal o un nombre de
"property"), y un objeto payload completo (con todos los resultTypes).@other() al final de la consulta. Si se encuentra
dicha ruta, se invocará a otherTypeCallback con el valor del elemento,
su ruta, su padre y el nombre de la propiedad de su padre,
y deberá devolver un booleano que indique si el valor suministrado
pertenece o no al tipo "other" (o puede manejar transformaciones y
devolver false).@string()//author$..author/store/*$.store.*/store//price$.store..price//book[3]$..book[2]//book[last()]$..book[(@.length-1)]$..book[-1:][(@['...'])]//book[position()<3]$..book[0,1]$..book[:2]//book/*[self::category\|self::author]//book/(category,author)$..book[0][category,author]//book[isbn]$..book[?(@.isbn)][?@['...']]//book[price<10]$..book[?(@.price<10)]//*[name() = 'price' and . != 8.95]$..*[?(@property === 'price' && @ !== 8.95)]@^/$$//*/*\|//*/*/text()$..*//*$..//*[price>19]/..$..[?(@.price>19)]^/store/*/name()$.store.*~/store/book[not(. is /store/book[1])]$.store.book[?(@path !== "$['store']['book'][0]")]@path//book[parent::*/bicycle/color = "red"]/category$..book[?(@parent.bicycle && @parent.bicycle.color === "red")].category@parent//book/*[name() != 'category']$..book.*[?(@property !== "category")]@property//book[position() != 1]$..book[?(@property !== 0)]@property/store/*/*[name(parent::*) != 'book']$.store.*[?(@parentProperty !== "book")]@parentProperty//book[count(preceding-sibling::*) != 0]/*/text()$..book.*[?(@parentProperty !== 0)]@parentProperty//book[price = /store/book[3]/price]$..book[?(@.price === @root.store.book[2].price)]@root//book/../*[. instance of element(*, xs:decimal)]$..book..*@number()@number()@boolean()@string()@null()@object()@array()@integer()@scalar()undefined@other()otherTypeCallback@undefined()@function()@nonFinite()//book/*[name() = 'category' and matches(., 'tion$')]$..book.*[?(@property === "category" && @.match(/TION$/i))]@property//book/*[matches(name(), 'bn$')]/parent::*$..book.*[?(@property.match(/bn$/i))]^@property^isbn` `$$`