Utilia

Probador de JSONPath

Prueba expresiones JSONPath sobre tu propio JSON en el navegador. Filtros, slices, descenso recursivo, rutas y JSON Pointers, con ejemplos listos para usar.

Cómo probar una expresión JSONPath

  1. Pega tu JSON en Datos JSON o haz clic en Cargar datos de ejemplo para usar el clásico ejemplo de la librería (store/book).
  2. Escribe una expresión en Expresión JSONPath o elige una en Ejemplos.
  3. El resultado se actualiza mientras escribes; Ejecutar la consulta lo vuelve a lanzar. La línea de estado indica el número de coincidencias.
  4. Usa Mostrar para cambiar entre Valores, Rutas, JSON Pointers y Rutas y valores, y copia el resultado.

La sintaxis de JSONPath en resumen

Sintaxis Significado Ejemplo
$ la raíz del documento $
.name o ['name'] un hijo $.store.bicycle
* todos los hijos $.store.*
.. descenso recursivo, a cualquier profundidad $..author
[n] índice de array, desde 0 $..book[2]
[inicio:fin:paso] slice; los números negativos cuentan desde el final $..book[-1:]
[a,b] unión $..book[0,1]
[?(expr)] filtro $..book[?(@.price < 10)]
^ el padre de cada coincidencia $..book[?(@.price > 20)]^
~ el nombre de la propiedad en lugar del valor $.store.*~

Los resultados se devuelven en el orden del documento. Rutas da rutas normalizadas como $['store']['book'][0]['title'], y JSON Pointers da la forma del RFC 6901 /store/book/0/title, práctica para JSON Patch o para las rutas de error de los validadores de JSON Schema.

Expresiones de filtro: qué se admite

Los filtros se evalúan con jsonpath-plus en modo seguro: la expresión la analiza e interpreta un pequeño evaluador, y nunca se pasa a eval ni a new Function. Dentro de [?( … )] puedes usar:

  • @ para el elemento actual, @.field y @['field'] para sus miembros, @root para el documento completo ($ no está disponible dentro de un filtro);
  • las comparaciones ==, !=, ===, !==, <, <=, >, >=;
  • la lógica &&, ||, !, la aritmética + - * / % y el ternario a ? b : c;
  • literales de cadena, número, true, false, null y expresiones regulares;
  • métodos de los propios valores, por ejemplo @.title.startsWith('S'), @.tags.includes('new') o @.title.match(/lord/i);
  • @property (la clave o el índice del elemento actual), @parent y @path (su ruta normalizada), al estilo de jsonpath-plus.

El acceso a constructor, __proto__ y al constructor Function está bloqueado. Si un filtro falla en un elemento, por ejemplo @.isbn.startsWith('0') en un libro sin isbn, ese elemento simplemente no coincide; un error de sintaxis en la expresión sí se indica. Los filtros escritos al estilo del RFC 9535, [?@.price < 10] sin paréntesis, se aceptan y se interpretan como [?(@.price < 10)]. Las funciones del RFC 9535 como length(), count(), match() y search() no están disponibles: usa en su lugar métodos de JavaScript como @.name.length.

Los selectores de tipo de jsonpath-plus también funcionan al final de una ruta: $..*@number() devuelve todos los números, y @string(), @boolean(), @array(), @object(), @null() e @integer() hacen lo mismo con los demás tipos.

Preguntas frecuentes

¿Se envía mi JSON a un servidor?

No. El análisis y la evaluación se hacen en tu navegador, y tus datos nunca salen de tu ordenador.

¿Por qué mi filtro no devuelve nada?

Comprueba que la ruta anterior al filtro seleccione un array o un objeto: $.store.book[?(@.price < 10)] filtra los libros, mientras que $.store[?(@.price < 10)] examina book y bicycle. Una propiedad que falta en un elemento es undefined, así que las comparaciones con ella son falsas.

¿Qué diferencia hay entre `==` y `===`?

Como en JavaScript, == convierte los tipos ("10" == 10 es verdadero), mientras que === compara tipo y valor.

¿Por qué está limitado el resultado?

Solo se escriben en el resultado las primeras 10 000 coincidencias, para que la página siga respondiendo; la línea de estado indica el recuento completo.

¿Está estandarizado JSONPath?

Sí, desde 2024, con el RFC 9535. Las implementaciones siguen difiriendo, sobre todo en los filtros; esta herramienta sigue jsonpath-plus, la sintaxis del JSONPath original de Stefan Goessner.