JSON Pointer, RFC 6901, e uma pequena especificacao: quatro paginas, uma
sintaxe, nenhuma ambiguidade sobre o que um caminho significa. Ele aparece
onde algo precisa referenciar um local exato dentro de um documento JSON
sem inventar sua propria linguagem de caminhos, mais comumente dentro de
JSON Schema e da palavra-chave $ref do JSON Schema.
A sintaxe, brevemente
Um pointer e uma sequencia de tokens separados por /. /user/name significa
a chave name dentro do objeto user. /items/0 significa o primeiro
elemento do array items. A string vazia, um pointer sem nenhum token,
significa o documento inteiro. Dois caracteres precisam de escape dentro de
um token: ~1 representa um / literal, e ~0 representa um ~ literal,
sempre lidos nessa ordem para que ~01 signifique ~1 em vez de /.
Usar o avaliador de JSON Pointer
Cole um documento, digite um pointer, e pressione Resolver. Dado
{"a/b":{"c~d":42},"list":["x","y"]}
o pointer /a~1b/c~0d resolve atraves de uma chave que literalmente contem
uma barra e uma chave que literalmente contem um til, retornando 42. Essa
e toda a razao pela qual os escapes existem: sem eles, uma chave contendo
o caractere separador seria impossivel de enderecar.
O que uma busca falhada informa
A maioria das ferramentas reporta um pointer falhado como um simples “nao
encontrado”, o que nao e suficiente para corrigi-lo em um documento com mais
de umas poucas chaves. Este informa ate onde o pointer chegou, o que encontrou
la, e quais chaves o objeto realmente tem. Pedir /a~1b/nope contra o mesmo
documento retorna:
Nenhuma chave “nope” no objeto aqui, ele tem c
d. Resolvido ate /a1b
Isso e suficiente para ver o erro de digitacao imediatamente, em vez de reler todo o documento para adivinhar o que deu errado.
O traco, e por que nao resolve
Dentro do JSON Patch, um traco como o ultimo token de um pointer para um
array significa “a posicao apos o ultimo elemento”, usado para anexar.
Sozinho, resolver /items/- contra um documento nao nomeia um valor
existente, porque ainda nao ha nada la para apontar. O avaliador explica
essa distincao em vez de trata-la como um erro de analise generico.
Onde isso difere do JSONPath
JSON Pointer nomeia um local e resolve para exatamente um valor ou falha. JSONPath e uma linguagem de consulta que pode corresponder a varios valores de uma vez, com curingas, filtros e fatiamentos. Use um pointer quando voce ja sabe exatamente qual valor deseja; use JSONPath quando esta procurando valores que correspondem a uma condicao.