Ao procurar itens em matrizes 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 posso usar para encontrar um item in [0].objects where id = 3
?
javascript
json
xpath
xquery
Naftuli Kay
fonte
fonte
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
que contenha seu objeto JSON, você escreveria:jsel(data).select("//*[@id=3]")
e retornaria o objeto que contém a chave id com 3.Respostas:
Sim, é chamado JSONPath . A fonte agora está no GitHub .
Também está integrado ao DOJO .
fonte
Eu acho que o JSONQuery é um superconjunto do JSONPath e, portanto, o substitui no dojo . Depois, há também o RQL .
Da documentação do Dojo:
JSONselect tem outro ponto de vista sobre a questão (semelhante ao seletor CSS, em vez de XPath) e possui uma implementação JavaScript .
fonte
Outras alternativas que conheço são
HTH.
fonte
Para resumir algumas das opções atuais para atravessar / filtrar dados JSON e fornecer alguns exemplos de sintaxe ...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select () (inspirado mais nos seletores de CSS)
.automobiles .maker:val("Honda") .model
JSONPath (inspirado mais no XPath)
$.automobiles[?(@.maker='Honda')].model
Eu acho que o JSPath é o mais bonito, então vou tentar integrá-lo ao meu aplicativo AngularJS + CakePHP.
(Originalmente, eu postei essa resposta em outro tópico, mas achei que seria útil aqui também.)
fonte
Tente usar JSPath
JSPath é uma linguagem específica de domínio (DSL) que permite navegar e localizar dados nos 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.
É fortemente otimizado para Node.js e navegadores modernos.
fonte
O XQuery pode ser usado para consultar o JSON, desde que o processador ofereça suporte a JSON. Este é um exemplo direto de como o BaseX pode ser usado para encontrar objetos com "id" = 1:
fonte
jq define um J SON q linguagem uery que é muito semelhante ao JSONPath - ver https://github.com/stedolan/jq/wiki/For-JSONPath-users
Assumirei o seguinte: encontre todos os objetos JSON sob a chave especificada com id == 3, não importa onde o objeto possa estar. Uma consulta jq correspondente seria:
onde "|" é o operador de pipe (como no comando shell pipes) e onde o segmento ".. | objetos" corresponde a "não importa onde o objeto possa estar".
O básico do jq é bastante óbvio ou intuitivo ou, pelo menos, bastante simples, e o resto é fácil de entender, se você estiver familiarizado com os pipes do shell de comando. A FAQ do jq possui indicadores para tutoriais e similares.
O jq também é como o SQL, pois suporta operações CRUD, embora o processador jq nunca substitua sua entrada. O jq também pode manipular fluxos de entidades JSON.
Dois outros critérios que você pode considerar na avaliação de uma linguagem de consulta orientada a JSON são:
fonte
Defiant.js também parece bem legal, aqui está um exemplo simples:
fonte
Json Pointer parece estar recebendo apoio crescente também.
fonte
Jsel é incrível e é baseado em um mecanismo XPath real. Permite criar expressões XPath para encontrar qualquer tipo de dados JavaScript, não apenas objetos (cadeias de caracteres também).
Você pode criar esquemas e mapeamentos personalizados para fornecer controle completo sobre como seus dados são acessíveis pelo mecanismo XPath. Um esquema é uma maneira de definir como elementos, filhos, atributos e valores de nós são definidos em seus dados. Então você pode criar suas próprias expressões para se adequar.
Como você tinha uma variável chamada
data
que continha o JSON da pergunta, você poderia usar o jsel para escrever:Isso retornará qualquer nó com um
id
atributo 3. Um atributo é qualquer valor primitivo (string, número, data, regex) dentro de um objeto.fonte
O ObjectPath é uma linguagem de consulta semelhante ao XPath ou JSONPath, mas muito mais poderosa graças aos cálculos aritméticos incorporados, mecanismos de comparação e funções internas. Veja a sintaxe:
Encontre na loja todos os sapatos de cor vermelha e preço menor que 50
$ .. sapatos. * [a cor é "vermelha" e o preço <50]
fonte
@Naftule - com "defiant.js", é possível consultar uma estrutura JSON com expressões XPath. Confira este avaliador para ter uma idéia de como ele funciona:
http://www.defiantjs.com/#xpath_evaluator
Diferentemente do JSONPath, "defiant.js" fornece o suporte em grande escala da sintaxe da consulta - do XPath nas estruturas JSON.
O código fonte do defiant.js pode ser encontrado aqui:
https://github.com/hbi99/defiant.js
fonte
O JMESPath parece ser muito popular hoje em dia (a partir de 2020) e aborda vários problemas com o JSONPath. Está disponível para vários idiomas.
fonte
Se você é como eu e apenas deseja fazer pesquisas baseadas em caminhos, mas não se importa com o XPath real, o lodash's
_.get()
pode funcionar. Exemplo de documentação do lodash:fonte
Experimente isso - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
É uma implementação muito simples em uma linha semelhante de xpath para xml. São nomes como jpath.
fonte