ToolHub
View All Posts

Guia de consultas JSONPath: Como buscar datos JSON

JSON se ha convertido no lenguaje universal da web. As APIs devolvem JSON, os arquivos de configuração usam JSON e as bases de datos almacenan documentos JSON. Mas a medida que as estruturas JSON se vuelven mais grandes e mais profundamente anidadas, encontrar valores específicos se vuelve cada vez mais difícil. Aquí é onde entra JSONPath. JSONPath é um lenguaje de consulta que te permite navegar e extrair datos de documentos JSON usando expresiones de ruta concisas, tal como XPath lo faz para XML. Esta guia cobre todo, desde a sintaxe básica até o filtrado avanzado, com exemplos práticos que podes aplicar imediatamente.

Que é JSONPath?

JSONPath é um lenguaje de consulta JSON propuesto originalmente por Stefan Goessner em 2007. Proporciona uma sintaxe compacta para seleccionar nodos de documentos JSON, similar a como os selectores CSS apuntan a elementos HTML o as expresiones XPath apuntan a nodos XML. Em vez de escrever bucles e lógica condicional para recorrer estruturas JSON, simplesmente escribes uma expresão que descreve a ruta em direção a os datos desejados.

As expresiones JSONPath começam desde o nodo raíz do documento JSON e navegan através de objetos e arrays até o valor desejado. O lenguaje soporta comodines, descenso recursivo, segmentação de arrays e expresiones de filtro, lo suficiente para a maioria das necessidades de extração de datos.

Documento JSON de exemplo

A lo largo de esta guia, usaremos o seguinte documento JSON como exemplo de trabalho. Este é o exemplo clásico de a propuesta original de JSONPath com datos adicionales:

{
  "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
    }
  }
}

Referencia de sintaxe JSONPath

JSONPath utiliza um pequeno conjunto de operadores que se combinan para formar consultas potentes. Aquí está a referencia completa de sintaxe:

OperadorDescriçãoExemplo
$Nodo raíz do documento$
.Operador filho (acede a propriedades do objeto)$.store
[]Índice de array ou operador filho$.store.book[0]
[*]Comodín para todos os elementos do array$.store.book[*]
..Descenso recursivo (busca em todos os niveles)$..author
.keyPropriedade de objeto nombrada$.store.bicycle
['key']Notação de corchetes para acesso a propriedades$['store']['book']
[start:end]Segmentação de array (índice final no incluído)$.store.book[0:2]
[?()]Expresiones de filtro< 10)]
()Expresão de script (depende de a implementação)$.store.book[(@.length-1)]

Expresiones básicas de JSONPath

Acesso ao nodo raíz e a os filhos diretos

O signo de dólar $ representa o nodo raíz do documento JSON. Desde ali, usas a notação de ponto para aceder a as propriedades do objeto e a notação de corchetes para aceder a os índices do array.

ExpresãoResultado
$Todo o documento JSON
$.storeO objeto store (contém o array book e o objeto bicycle)
$.store.bicycle{"cor": "red", "price": 19.95}
$.store.bicycle.cor"red"
$.store.bookTodo o array book
$.store.book[0]O primer objeto book
$.store.book[0].title"Sayings of the Century"
$.store.book[3].author"J.R.R. Tolkien"

Notação de corchetes

A notação de corchetes é uma alternativa a a notação de ponto, útil quando os nombres de propriedade contêm caracteres especiais, espaços o começam com um número:

$.store['book'][0]['title']
$['store']['bicycle']['color']

A notação de corchetes e a notação de ponto são intercambiaveis para as propriedades do objeto. No entanto, a notação de corchetes é obligatoria quando os nombres de propriedade são dinámicos o contêm caracteres que no são válidos na notação de ponto.

Operador comodín

O operador comodín * coincide com todos os elementos de um array o todas as propriedades de um objeto. É extremadamente útil para extrair todos os valores em um nivel sem conhecer as claves o índices específicos.

ExpresãoResultado
$.store.*Todos os valores do objeto store (o array book e o objeto bicycle)
$.store.book[*]Todos os libros do array (os quatro objetos book)
$.store.book[*].authorTodos os nombres de autor: ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"]
$.store.*.priceO precio de bicycle e o array book (no os precios dois libros individuais)

Descenso recursivo: o operador de duplo ponto

O operador de duplo ponto .. é uma das características mais potentes de JSONPath. Busca a clave especificada em cada nivel do árbol JSON, no solo nos filhos diretos. Pensa em isso como uma búsqueda profunda em todo o documento.

ExpresãoResultado
$..authorValores de author em todas as ubicaciones do documento
$..priceTodos os valores de price: [8.95, 12.99, 8.99, 22.99, 19.95]
$..book[2]O tercer libro, encontrado recursivamente
$..categoryTodos os valores de category: ["reference", "fiction", "fiction", "fiction"]

O operador de descenso recursivo é particularmente útil quando no conheces a ruta exata em direção a os datos desejados, o quando a mesma clave aparece em múltiples niveles de anidamiento. Por exemplo, se uma respuesta de API contém campos id em vários niveles de anidamiento, $..id recopilaria todos os id.

Segmentação de arrays

A segmentação de arrays te permite seleccionar um rango de elementos de um array. A sintaxe [start:end] selecciona elementos desde o índice de inicio até (mas sem incluir) o índice final. Se soportan índices positivos e negativos.

ExpresãoResultado
$.store.book[0:2]Os dois primeros libros (índices 0 e 1)
$.store.book[1:3]O segundo e tercer libro (índices 1 e 2)
$.store.book[-1]O último libro (The Lord of the Rings)
$.store.book[-2:]Os dois últimos libros
$.store.book[:2]Os dois primeros libros (igual que [0:2])
$.store.book[2:]O tercer libro e seguintes

Ten em cuenta que o comportamento de segmentação pode variar ligeramente entre diferentes implementações de JSONPath. A sintaxe anterior segue as convenciones utilizadas por a maioria das bibliotecas populares e o estándar IETF RFC 9535.

Expresiones de filtro

As expresiones de filtro são onde JSONPath se vuelve realmente potente. Te permitem seleccionar elementos basados em condiciones em vez de posição. A sintaxe de filtro usa [?(condition)], onde a condição se evalúa para cada elemento.

Operadores de comparação

JSONPath soporta os seguintes operadores de comparação em expresiones de filtro:

OperadorSignificadoExemplo
==Igual a[?(@.category == "fiction")]
!=No igual a[?(@.category != "fiction")]
<Menor que< 10)]
<=Menor o igual que<= 8.99)]
>Mayor que[?(@.price > 15)]
>=Mayor o igual que[?(@.price >= 12.99)]
=~Coincidencia de regex (implementação parcial)[?(@.author =~ /Tolkien/i)]

Exemplos práticos de filtrado

Usando nosso documento de exemplo, aquí há expresiones de filtro práticas e suas resultados:

Find all books cheaper than $10:

< 10)]

Devolve os libros "Sayings of the Century" ($8.95) e "Moby Dick" ($8.99).

Find all fiction books:

$.store.book[?(@.category == "fiction")]

Devolve três libros: "Sword of Honour", "Moby Dick" e "The Lord of the Rings".

Find books with an ISBN:

$.store.book[?(@.isbn)]

Devolve os libros que têm uma propriedade isbn: "Moby Dick" e "The Lord of the Rings". Isto se deve a que o filtro verifica a existencia de a propriedade.

Find the most expensive book:

$.store.book[?(@.price > 20)]

Devolve "The Lord of the Rings" ($22.99).

Operadores lógicos em filtros

Podes combinar condiciones usando operadores lógicos:

< 10 && @.category == "fiction")]
$.store.book[?(@.price > 15 || @.category == "reference")]

A primera expresão encontra libros de ficção abaixo de $10 (solo "Moby Dick"). A segunda encontra libros que cuestan mais de $15 o pertencem a a categoria de referencia (devolve "Sayings of the Century" e "The Lord of the Rings").

JSONPath vs. XPath

JSONPath está explicitamente modelado segundo XPath, e os dois lenguajes compartilham muitas similitudes conceptuales. Se estás familiarizado com o processamento XML, compreender esta relação é útil.

FuncionalidadeJSONPathXPath
Símbolo raíz$/
Acesso a filhos.key o ['key']/element
Índice de array[0][1] (começa em 1)
Comodín**
Recursão de niveles: especifica a profundidade máxima de anidamiento permitida para objetos e arrays...//
Validação condicional: aplica diferentes regras de validação basadas no valor de outro campo.[?(condition)][condition]
PropriedadeFormato de fecha e hora: valida cadenas de fecha e hora ISO 8601 com restricciones de zona horaria.@attr
Campos opcionales: marca campos como opcionales eliminándolos da lista required.Valores predeterminados: especifica valores predeterminados que se aplican quando um campo está ausente.Existem ferramentas que generen código a partir de JSON Schema?
Sí, várias ferramentas podem generar código a partir de JSON Schema: quicktype genera TypeScript, Go, C# e outros tipos de lenguaje; json-schema-to-typescript crea interfaces TypeScript; datamodel-code-generator genera modelos Python; jsonschema2pojo genera clases Java. Estas ferramentas aceleran o desenvolvimento asegurando que os tipos de código coincidan com tua Schema.Se/no/então: especifica condiciones que determinan que Schema validar...
Se a propriedade de condição contém um valor específico, valida contra o Schema "then".Se/no/então: especifica condiciones que determinan que Schema validar.Se a propriedade de condição contém um valor diferente, valida contra o Schema "else".
Se nenhuma condição coincide, o se no há cláusula "else", a validação passa por defecto.O Schema em "then" se aplica quando o valor de paymentMethod é "credit_card".O Schema em "else" se aplica quando o valor de paymentMethod é "paypal".

A diferença clave é que XPath opera sobre um modelo de árbol rico com elementos, atributos, nodos de texto, espaços de nombres e instrucciones de processamento. JSONPath opera sobre um modelo mais simple de objetos (mapas clave-valor) e arrays (listas ordenadas). Esta simplicidade faz que JSONPath seja mais fácil de aprender mas menos expresivo que XPath para consultas complejas.

JSONPath na prática

Experimentas de API

JSONPath é indispensavel para as experimentas de API. Quando envías uma requisição a uma API e recebes uma respuesta JSON grande, JSONPath te permite fazer afirmaciones sobre valores específicos sem navegar manualmente toda a estrutura. A maioria das ferramentas de experimenta de API soportan JSONPath de forma nativa.

Por exemplo, em uma experimenta poderias verificar que o primer libro cuesta menos de $10:

// Using a JSONPath assertion in testing
response.jsonPath().get("store.book[0].price").should(equals(8.95));

// Find all books by a specific author
response.jsonPath().get("store.book[?(@.author == 'Herman Melville')].title");
// Returns: ["Moby Dick"]

Transformação de datos

Ao integrar sistemas que usam diferentes formatos de datos, JSONPath ajuda a extrair e transformar campos específicos. Podes extrair valores de uma estrutura JSON e mapearlos a outra sem escrever código de recorrido complejo.

Gestión de configuração

Os arquivos de configuração complejos frequentemente contêm JSON profundamente anidado. JSONPath te permite consultar valores de configuração específicos sem cargar e analizar toda a estrutura. Ferramentas como jq usam uma sintaxe similar a JSONPath para processar JSON em tuberías de linha de comandos.

Monitorização e alertas

Em sistemas de observabilidade, as consultas JSONPath podem extrair métricas de logs e respuestas de API em formato JSON. Podes configurar alertas que se activen quando uma consulta JSONPath devuelva valores que excedan um umbral.

Implementações de JSONPath

JSONPath está disponivel em praticamente todos os lenguajes de programação. Aquí estão as bibliotecas mais populares:

LenguajeBibliotecaInstalação
JavaScriptjsonpath-plusnpm install jsonpath-plus
Pythonjsonpath-ngpip install jsonpath-ng
JavaJsonPath (Jayway)Maven: com.jayway.jsonpath
C#Json.NET (Newtonsoft)NuGet: Newtonsoft.Json
Gogjsongo get github.com/tidwall/gjson
PHPjsonpathcomposer require softcreatr/jsonpath
Rubyjsonpathgem install jsonpath

Exemplo em JavaScript

< 10)]',
  json: data
});
// Returns books with price < 10

Python Example

from jsonpath_ng import parse

data = { /* our sample JSON */ }

# Find all authors
author_expr = parse('$..author')
authors = [match.value for match in author_expr.find(data)]
# ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"]

# Find cheap books
cheap_expr = parse('$.store.book[?(@.price < 10)]')
cheap_books = [match.value for match in cheap_expr.find(data)]

Common Pitfalls and Tips

Valida contra um Schema existente em um campo diferente.

Trampas comuns e dicas

Em 2024, o IETF publicó o RFC 9535, estandarizando formalmente JSONPath. A especificação resolve muitas das ambigüedades e inconsistencias que existían entre implementações. Os aspectos clave do estándar incluem:

Se estás começando um novo projeto, prefere bibliotecas que implementen o RFC 9535 para máxima compatibilidade e comportamento previsível.

Necessitas consultar datos JSON rápidamente? Experimenta nosso probador de JSONPath online gratuito para evaluar expresiones contra tuas documentos JSON em tiempo real.

Se paymentMethod no é nem "credit_card" nem "paypal", nenhuma condição se aplica e a validação passa por defecto.

Estándar IETF: RFC 9535

Exemplo em Python

JSONPath é um lenguaje de consulta JSON, similar a XPath para XML. Utiliza expresiones de ruta para navegar e extrair valores específicos de documentos JSON. Uma expresão JSONPath como $.store.book[0].title te permite localizar datos com precisão em estruturas JSON complejas e anidadas sem escrever código de análisis personalizado.

Que é JSONPath?

JSONPath está disenhado para a estrutura de objetos e arrays de JSON, enquanto que XPath está disenhado para o árbol de elementos e atributos de XML. JSONPath usa $ como nodo raíz, notação de ponto para aceder a objetos e notação de corchetes para aceder a arrays. XPath usa / para separação de rutas e @ para aceder a atributos. JSONPath é mais simple mas menos rico em funcionalidades que XPath.

Em que se diferença JSONPath de XPath?

O duplo ponto (..) em JSONPath é o operador de descenso recursivo. Busca a clave nombrada em todos os niveles de a estrutura JSON, no solo nos filhos diretos. Por exemplo, $..author encontra todas as claves author em qualquer lugar de todo o documento, sem importar cuán profundamente estén anidadas.

Que significa o duplo ponto (..) em JSONPath?

<, ><=, >< 10)] encontra todos os libros que cuestan menos de $10.

Pode JSONPath filtrar datos segundo condiciones?

JSONPath fue propuesto originalmente por Stefan Goessner em 2007 sem uma especificação formal, lo que llevó a variaciones entre implementações. Em 2024, o IETF publicó o RFC 9535 estandarizando formalmente JSONPath. As implementações modernas estão convergiendo em direção a este estándar, mas algumas bibliotecas mais antiguas aún podem ter leves diferenças de sintaxe.