Ir para o conteúdo
ToolsMinify logo
Todos os artigos

Consultar JSON com JSONPath - As expressoes que voce realmente digita

$ e @, ponto vs colchetes, curingas, descida recursiva, slices e um filtro simples - mais RFC 9535 vs o dialeto Goessner antigo e cinco exemplos para colar em um mesmo payload.

Atualizado em 23 de setembro de 20268 min de leitura

Use o Testador JSONPath - de graça

Abra a ferramenta e aplique o que você aprendeu neste guia.

Abrir Testador JSONPath

JSONPath e uma linguagem de consulta para JSON como XPath e para XML: voce aponta para nos em vez de escrever loops aninhados. Na maioria dos dias voce so precisa de alguns tokens - `$`, `@`, pontos, colchetes, `*`, `..`, um slice e um filtro `[?()]` simples. Este guia e essa lista curta, nao um clone completo do RFC. Cole o exemplo abaixo no Testador JSONPath e experimente cada expressao no navegador - nada e enviado.

Resposta rapida

Comece cada caminho com `$` (a raiz do documento). Use `@` dentro de um filtro para o item atual. Prefira `$.store.book[*].title` no dia a dia; use `$['store']['book'][0]` quando a chave tiver espacos ou caracteres reservados. `$..author` encontra um campo em qualquer profundidade. Filtros parecem `$.store.book[?(@.price < 10)]`. Trate RFC 9535 como o dialeto moderno e amostras Goessner antigas como folclore ate voce verifica-las.

Um mesmo payload de exemplo

Todos os exemplos usam o documento classico da livraria (o mesmo formato que muitos tutoriais de JSONPath compartilham). Mantenha-o aberto enquanto le:

  • `store.book` - um array de objetos com `category`, `author`, `title`, `price` e as vezes `isbn`.
  • `store.bicycle` - um objeto aninhado com `color` e `price`.
  • Se o payload chegou em uma linha so, formate primeiro com o Minificador e formatador JSON e depois consulte.

$ e @

`$` e a raiz do valor JSON que voce colou - o objeto ou array inteiro. Toda expressao util comeca ali. `@` so faz sentido dentro de um filtro: significa "o elemento atual sendo testado." Fora de um filtro, `@` nao e um cursor livre.

  • `$` - a raiz do documento.
  • `@.price` dentro de `[?()]` - o campo `price` do item sob teste.
  • `$.store.book[?(@.isbn)]` - livros que tem a chave `isbn` (existencia).
  • Um caminho sem `$` costuma ser rejeitado por testers estritos - sempre comece com `$`.

Ponto vs colchetes

Notacao com ponto e atalho para identificadores simples: `$.store.book`. Notacao com colchetes e a forma explicita: `$['store']['book']`. Use colchetes quando a chave nao for um identificador simples (espacos, hifens, digitos no inicio) ou quando quiser o estilo de caminho normalizado RFC 9535 que muitas tools mostram na tabela de matches.

  • `$.store.bicycle.color` - ok para chaves comuns.
  • `$['content-type']` - necessario quando a chave nao e um identificador estilo JS.
  • `$['store']['book'][0]['title']` - caminho singular normalizado para um no (estilo RFC 9535 §2.7).
  • Indices sempre vao em colchetes: `$.store.book[0]`, nao `$.store.book.0`.

* e ..

`*` e um curinga para "cada filho neste nivel." `..` e descida recursiva: percorre a arvore e coleta matches em qualquer profundidade. Curingas ficam rasos; a descida pode surpreender em documentos grandes.

  • `$.store.book[*].title` - o titulo de cada livro (um nivel de itens do array).
  • `$.store.*` - tanto `book` quanto `bicycle` sob `store`.
  • `$..author` - cada `author` em qualquer lugar sob a raiz.
  • `$..price` - precos dos livros e o do bicycle juntos - aperte o caminho se so queria um.

Slices

Slices de array usam `start:end:step` no estilo Python dentro de colchetes. Extremidades omitidas significam "do inicio" ou "ate o fim." Indices negativos contam do fim quando a implementacao os suporta.

  • `$.store.book[0:2]` - os dois primeiros livros (indices 0 e 1).
  • `$.store.book[-1:]` - o ultimo livro, em engines que permitem indices negativos.
  • `$.store.book[::2]` - um livro sim, um nao, quando o step e suportado.
  • Slices selecionam itens do array; encadeie um campo depois: `$.store.book[0:2].title`.

Um filtro simples

Filtros ficam em `[?(...)]` e mantem itens onde a expressao e verdadeira. `@` e o elemento atual. Comparacoes em geral nao forcam tipos como JavaScript frouxo - `1 == "1"` costuma ser falso. Mantenha filtros simples: igualdade, desigualdade, compare numerico, `&&`, `||`, `!` e existencia.

  • `$.store.book[?(@.price < 10)]` - livros baratos.
  • `$.store.book[?(@.price < 10 && @.category == 'fiction')].title` - filtre e depois extraia um campo.
  • `$.store.book[?(@.isbn)]` - itens que tem `isbn`.
  • Coloque o filtro no array que voce esta varrendo, nao em uma raiz objeto sozinha a menos que a raiz seja um array.

RFC 9535 vs o dialeto Goessner antigo

O artigo de Stefan Goessner de 2007 popularizou JSONPath e muitas bibliotecas ainda copiam seus exemplos. RFC 9535 (2024) e o padrao IETF: gramatica mais clara, caminhos normalizados e menos escapatorias de "eval qualquer coisa". Seletores script como `[(@.length-1)]` e JavaScript livre dentro de filtros pertencem ao velho oeste, nao a um tester seguro no navegador.

  • RFC 9535 - operadores padronizados, caminhos normalizados como `$['store']['book'][0]`, feito para implementacoes interoperaveis.
  • Amostras da era Goessner - ainda estao em muitos blogs; verifique antes de usar em producao.
  • Subconjuntos sem eval - o que voce quer para payloads de API colados. Rejeite seletores script; nunca execute o caminho como JavaScript.
  • Quando duas tools discordam, veja qual dialeto reivindicam - nao qual "parece" certo.

Nao e a spec completa

Este artigo e um cola de expressoes do dia a dia. Para o detalhe normativo, leia RFC 9535. Para testes privados contra o seu JSON, use o Testador JSONPath.

Cinco exemplos para copiar e colar

No sample da livraria, experimente estes nesta ordem:

  • `$.store.book[*].title` - todos os titulos como lista.
  • `$..author` - cada autor via descida recursiva.
  • `$.store.book[0:2]` - os dois primeiros objetos livro.
  • `$.store.book[?(@.price < 10)]` - livros com preco menor que 10.
  • `$.store.book[?(@.price < 10)].title` - o mesmo filtro, so titulos.

Depois de extrair uma lista plana de registros, voce pode querer uma planilha - passe um array JSON de objetos pelo Conversor JSON para CSV. Para blobs de API aninhados que ainda esta explorando, fique no JSONPath ate a forma ficar clara.

Perguntas frequentes

Todo JSONPath comeca com $?

Sim na pratica. `$` nomeia a raiz. Tools estritas rejeitam caminhos que o omitem.

Quando uso @?

So dentro de filtros `[?()]`, como o elemento atual. Nao substitui `$` no inicio de um caminho.

Por que obtive zero matches?

Um caminho valido pode nao bater com nada. Causas comuns: filtrar uma raiz objeto em vez de um array, typo em uma chave, ou esperar coercao de tipos do JavaScript. Tente `$..field` para confirmar que o campo existe e depois aperte.

JSONPath e o mesmo que JMESPath ou jq?

Nao. Ideia relacionada, sintaxe e bibliotecas diferentes. Escolha um dialeto por codebase e fique nele.

Posso testar uma resposta de API privada com seguranca?

Sim se o avaliador roda no navegador sem upload. O Testador JSONPath e feito para isso - cole, consulte, copie JSON extraido ou caminhos normalizados.

Experimente no ToolsMinify

Todas as tools abaixo rodam no navegador - gratis, sem cadastro, sem upload:

Experimente gratis

Abra o Testador JSONPath, carregue o sample da livraria e cole `$.store.book[?(@.price < 10)].title`. Voce deve ver os titulos baratos - tudo no seu dispositivo.

Use o Testador JSONPath - de graça

Abra a ferramenta e aplique o que você aprendeu neste guia.

Abrir Testador JSONPath

Artigos relacionados