JSONPath online: prueba expresiones JSONPath con filtros, comodines y rutas de cada resultado
Pega un JSON en el cuadro de la izquierda y escribe una expresión en JSONPath expression. Cada coincidencia aparece en Matches con su valor y su ruta normalizada, por ejemplo `$['user']['roles'][0]`, así que sabes exactamente de dónde sale cada resultado. Los botones de ejemplo bajo el campo cargan expresiones listas para probar. Funciona la sintaxis completa: comodines, búsqueda recursiva, slices y filtros; y una ruta corta con puntos como `user.profile.email` se interpreta como `$.user.profile.email`. El JSON se evalúa en tu navegador y no se sube a ningún servidor.
Sintaxis de JSONPath
JSONPath selecciona partes de un documento JSON igual que XPath selecciona partes de un XML. Lo propuso Stefan Goessner en 2007 y en febrero de 2024 el IETF lo estandarizó como RFC 9535. Una expresión empieza siempre en la raíz, $, y baja por miembros de objetos y elementos de arrays:
$ el documento completo
$.pedido.lineas acceso a miembros con puntos
$['pedido']['lineas'] lo mismo con corchetes (para claves con espacios o puntos)
$.pedido.lineas[0] primer elemento del array
$.pedido.lineas[-1:] último elemento (un slice)
$.pedido.lineas[0:2] elementos 0 y 1 (el final no se incluye)
$.pedido.lineas[*] todos los elementos
$.pedido.cliente.* todos los miembros de cliente
$..precio cualquier precio a cualquier profundidad
$.pedido.lineas[?(@.precio < 20)] filtro: líneas de menos de 20
Dentro de un filtro, @ es el elemento que se está evaluando. Las condiciones admiten ==, !=, <, <=, > y >=, se combinan con && y ||, y [?(@.oferta)] deja solo los elementos que tienen el miembro oferta.
Ejemplos con un pedido
Toma un pedido con un cliente, tres líneas (sku, producto, precio, cantidad; solo la camiseta tiene "oferta": true) y un envío urgente de 4.95. Estos son los resultados reales del probador:
$.pedido.lineas[*].producto ["Taza", "Camiseta", "Libro"]
$..precio [8.5, 19.9, 24, 4.95]
$.pedido.lineas[?(@.precio < 20)].producto ["Taza", "Camiseta"]
$.pedido.lineas[?(@.oferta)].sku ["CAM-07"]
$.pedido.lineas[?(@.precio > 5 && @.cantidad > 1)].sku ["TAZ-01"]
$.pedido.lineas[-1:].producto ["Libro"]
pedido.cliente.email ["lucia@example.com"]
Fíjate en $..precio: devuelve también el precio del envío, porque la búsqueda recursiva recorre todo el documento. La ruta de cada coincidencia lo deja claro, ya que la última es $['pedido']['envio']['precio']. Una consulta JSONPath siempre produce una lista, aunque seleccione un único valor, porque la misma expresión puede coincidir con cero, uno o muchos nodos.
Diferencias con RFC 9535 y otras librerías
El probador usa jsonpath-plus 10.4.0, una implementación de JavaScript muy extendida que sigue la sintaxis de Goessner. RFC 9535 es más estricto y difiere en algunos detalles, igual que otras librerías, y esa es la razón más común de que una expresión funcione en una herramienta y no en otra:
último elemento RFC 9535: $.lineas[-1] aquí: $.lineas[-1:]
filtro RFC 9535: [?@.precio < 20] aquí: [?(@.precio < 20)]
igualdad aquí == compara como JavaScript: @.precio == "24" coincide con 24
usa === si quieres distinguir el número del texto
Ojo, porque las formas de RFC 9535 no dan error en este motor: $.pedido.lineas[-1].producto y [?@.precio < 20] simplemente devuelven una lista vacía. RFC 9535 define además funciones como length(), count(), match() y search(); los motores de estilo Goessner permiten en cambio expresiones de JavaScript dentro de los filtros, que el probador evalúa en un entorno seguro sin ejecutar código arbitrario. Prueba siempre con la sintaxis de la librería que usarás en producción.
JSONPath en otras herramientas
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
SELECT JSON_EXTRACT(doc, '$.cliente.email') FROM pedidos; -- MySQL
SELECT jsonb_path_query(doc, '$.lineas[*] ? (@.cantidad > 1)') FROM pedidos; -- PostgreSQL
Kubernetes usa plantillas JSONPath entre llaves y permite omitir el $ inicial. Las funciones JSON de MySQL aceptan un subconjunto: acceso a miembros, índices de arrays y los comodines * y **, sin filtros. PostgreSQL implementa el lenguaje SQL/JSON path, que se parece pero coloca el filtro después de la ruta, ? (@ > 1), y tiene modos lax y strict. Herramientas de pruebas de API como Postman, REST Assured o Karate también usan JSONPath o variantes cercanas.
jq no es JSONPath: .pedido.lineas[] | select(.precio < 20) | .producto hace el mismo trabajo con su propio lenguaje, y las expresiones no son intercambiables.
Cómo escribir expresiones robustas
En código de producción, prefiere rutas explícitas a la búsqueda recursiva. $..id es cómodo para explorar, pero también encuentra campos id de objetos anidados que no buscabas, y un objeto nuevo en la respuesta de la API puede cambiar el resultado sin avisar. Usa la notación con corchetes para las claves con puntos, guiones o espacios, como $['clave con espacio'], y apoya los filtros en campos estables.
Cuando una consulta no devuelve nada, el probador muestra No match con un par de ejemplos de rutas. Construye la expresión paso a paso: $.pedido, luego $.pedido.lineas, luego $.pedido.lineas[*] y por último el filtro. El primer paso que devuelve una lista vacía es donde la ruta y los datos dejan de coincidir.
JSON inválido y privacidad
Si el JSON no se puede analizar, el probador muestra el error del parser en lugar de resultados; corrígelo en el formateador de JSON, que indica la línea y la columna. Los documentos, las expresiones y los resultados se quedan en tu navegador, así que puedes pegar respuestas de API con tokens o datos de clientes.
Frequently asked questions
¿Qué es JSONPath?
Un lenguaje de consulta para seleccionar valores de un JSON, parecido a XPath para XML. Las expresiones empiezan en $ y usan puntos, corchetes, comodines y filtros. Se estandarizó como RFC 9535 en 2024.
¿Cómo filtro un array con JSONPath?
Con una expresión de filtro en la que @ es el elemento actual, por ejemplo $.pedido.lineas[?(@.precio < 20)].producto. Combina condiciones con && y ||.
¿Cómo obtengo el último elemento de un array?
Con el slice $.lineas[-1:]. RFC 9535 admite también $.lineas[-1], pero muchos motores, incluido el de este probador, necesitan la forma de slice y con [-1] devuelven una lista vacía.
¿Qué significa $.. en JSONPath?
Es la búsqueda recursiva: $..precio encuentra todos los miembros precio a cualquier profundidad del documento. Sirve para explorar, pero puede devolver más de lo que esperas.
¿Por qué mi expresión JSONPath no devuelve nada?
La ruta no coincide con la estructura, una clave está mal escrita o necesita corchetes, o el motor espera otra sintaxis de filtro. Construye la ruta paso a paso para ver dónde deja de coincidir.
¿Puedo escribir la ruta sin el $ inicial?
Sí. Una ruta corta como user.profile.email se interpreta como $.user.profile.email. Para filtros, slices y búsqueda recursiva es mejor escribir la expresión completa con $.