javascript - Existe um equivalente em JSON para XQuery/XPath?
Ao pesquisar itens em arrays e hashes JSON complexos, como:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Existe algum tipo de linguagem de consulta que eu possa usar para encontrar um item em [0].objects onde id=3?
Resposta #1
Sim, chama-se JSONPath:
Também está integrado ao DOJO.
Resposta #2
JMESPath é uma biblioteca bastante madura, com uma especificação detalhada e suporte para múltiplas linguagens.
Exemplos de Sintaxe:
// Select a single item
people[1].firstName
// Select a slice of an array
people[0:5]
// Select all the first names
people[*].firstName
// Select all first names based on search term
people[?state=='VA'].firstName
// Count how many people are over 35
length(people[?age>`35`])
// Select only the name and age of people over 35
people[?age>`35`].{name: name, age: age}
// Join expressions together to sort and join elements into a string
people[?state == 'WA'].name | sort(@) | join(', ', @)
Há muitos mais exemplos ao vivo com os quais você pode brincar na documentação.
A biblioteca JS tem 19kb minificada, então possivelmente é maior que algumas, mas considerando os recursos extensos, você pode achar que vale a pena.
Outras Opções
Também existem algumas outras opções para percorrer/filtrar dados JSON, junto com alguns exemplos de sintaxe para ajudá-lo a comparar...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.modeljson:select() (inspirado mais pelos seletores CSS)
.automobiles .maker:val("Honda") .modelJSONPath (inspirado mais pelo XPath)
$.automobiles[?(@.maker='Honda')].model
Resposta #3
Eu acho que JSONQuery é um superconjunto de JSONPath e, portanto, o substitui no dojo. Então, também há RQL.
Da documentação do Dojo:
JSONQuery é uma versão estendida do JSONPath com recursos adicionais para segurança, facilidade de uso e um conjunto abrangente de ferramentas de consulta de dados, incluindo filtragem, busca recursiva, ordenação, mapeamento, seleção por intervalo e expressões flexíveis com comparações de strings curinga e diversos operadores.
O JSONselect tem outro ponto de vista sobre a questão (semelhante a seletor CSS, em vez de XPath) e possui uma implementação em JavaScript.
Resposta #4
Outras alternativas que conheço são
- Especificação JSONiq, que especifica dois subtipos de linguagens: uma que oculta detalhes de XML e fornece sintaxe semelhante à JS, e uma que enriquece a sintaxe XQuery com construtores JSON e similares. Zorba implementa JSONiq.
- Corona, que se baseia no MarkLogic, fornece uma interface REST para armazenar, gerenciar e pesquisar conteúdo XML, JSON, Texto e Binário.
- O MarkLogic 6 e versões posteriores fornecem uma interface REST semelhante à do Corona imediatamente.
- O MarkLogic 8 e posteriores suportam JSON nativamente tanto em seu ambiente XQuery quanto no JavaScript do lado do servidor. Você pode aplicar XPath nele.
Espero que ajude.
Resposta #5
Tente usar JSPath
JSPath é uma linguagem específica de domínio (DSL) que permite navegar e encontrar dados dentro dos seus documentos JSON. Usando JSPath, você pode selecionar itens de JSON para recuperar os dados que eles contêm.
JSPath para JSON como um XPath para XML.
Ele é altamente otimizado tanto para Node.js quanto para navegadores modernos.
Resposta #6
Existe algum tipo de linguagem de consulta ...
jq define uma linguagem de consulta JSON quase idêntica ao JSONPath -- veja https://github.com/stedolan/jq/wiki/For-JSONPath-users
... [que] eu posso usar para encontrar um item em [0].objects onde id=3?
Vou assumir que isso significa: encontrar todos os objetos JSON sob a chave especificada com id == 3, não importando onde o objeto possa estar. Uma consulta jq correspondente seria:
.[0].objects | .. | objects | select(.id==3)
onde "|" é o operador pipe (como em pipes de shell de comando), e onde o segmento ".. | objects" corresponde a "não importa onde o objeto esteja".
O básico do jq é em grande parte óbvio ou intuitivo ou pelo menos bastante simples, e a maior parte do resto é fácil de aprender se você estiver minimamente familiarizado com pipes de shell de comando. O FAQ do jq tem indicações de tutoriais e coisas do tipo.
jq também é como SQL no sentido de que suporta operações CRUD, embora o processador jq nunca sobrescreva sua entrada. jq também pode lidar com fluxos de entidades JSON.
Outros dois critérios que você pode desejar considerar ao avaliar uma linguagem de consulta orientada a JSON são:
- ele suporta expressões regulares? (jq 1.5 tem suporte abrangente para regex PCRE)
- é Turing-completo? (sim)
Resposta #7
XQuery pode ser usado para consultar JSON, desde que o processador ofereça suporte a JSON. Este é um exemplo simples de como o BaseX pode ser usado para encontrar objetos com "id"=1:
json:parse('[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [ "etc." ] }
]}
]')//value[.//id = 1]
Resposta #8
O Json Pointer parece estar recebendo cada vez mais apoio também.
