Existe uma linguagem semelhante a SQL ou XQuery para consultar JSON?
Estou pensando em conjuntos de dados muito pequenos que são bem mapeados para JSON, onde seria bom responder facilmente a consultas como "quais são todos os valores de X onde Y> 3" ou para executar as operações usuais do tipo SUM / COUNT.
Como exemplo completamente inventado, algo como isto:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) WHERE Y > 0 (would equate to 7)
LIST(X) WHERE Y > 0 (would equate to [3,4])
Eu estou pensando que isso funcionaria tanto do lado do cliente quanto do servidor, com os resultados sendo convertidos na estrutura de dados específica do idioma apropriada (ou talvez mantida como JSON)
Uma rápida pesquisa no Google sugere que as pessoas pensaram sobre isso e implementaram algumas coisas ( JAQL ), mas não parece que um uso padrão ou conjunto de bibliotecas tenha surgido ainda. Embora cada função seja bastante trivial de implementar por conta própria, se alguém já fez isso corretamente, não quero reinventar a roda.
Alguma sugestão?
Edit: Isso pode realmente ser uma má idéia ou JSON pode ser um formato muito genérico para o que estou pensando. O motivo para querer uma linguagem de consulta em vez de apenas executar as funções de soma / etc diretamente, conforme necessário, é que espero criar as consultas dinamicamente com base na entrada do usuário. Como o argumento de que "não precisamos de SQL, podemos apenas escrever as funções que precisamos". Eventualmente, isso sai do controle ou você acaba escrevendo sua própria versão do SQL à medida que avança cada vez mais. (Ok, eu sei que isso é um argumento meio bobo, mas você entendeu ..)
fonte
Respostas:
Claro, que tal:
Todos eles parecem ter um pouco de trabalho em andamento, mas funcionam até certo ponto. Eles também são semelhantes ao XPath e XQuery conceitualmente; mesmo que XML e JSON tenham modelos conceituais diferentes (hierárquico x objeto / estrutura).
EDIT Set-2015: Atualmente, agora existe o padrão JSON Pointer que permite uma passagem muito simples e eficiente do conteúdo JSON. Ele não é apenas formalmente especificado, mas também é suportado por muitas bibliotecas JSON. Então, eu chamaria isso de padrão útil real real, embora, devido à sua expressividade limitada, possa ou não ser considerado o Query Language por si só.
fonte
Eu recomendaria meu projeto no qual estou trabalhando, chamado jLinq . Estou à procura de feedback para que eu esteja interessado em ouvir o que você pensa.
Se permite escrever consultas semelhantes às que você faria no LINQ ...
Também é totalmente extensível!
A documentação ainda está em andamento, mas você ainda pode experimentá-la online.
fonte
Atualização: o XQuery 3.1 pode consultar XML ou JSON - ou ambos juntos. E XPath 3.1 também pode.
A lista está crescendo:
fonte
O jmespath funciona realmente muito fácil e bem, http://jmespath.org/ Ele está sendo usado pela Amazon na interface de linha de comando da AWS, portanto, deve ser bastante estável.
fonte
jmespath
para o--query
parâmetro, mas recomendajq
a tubulação da linha de comando. docs.aws.amazon.com/cli/latest/userguide/…jq é um J SON q linguagem uery, destina-se principalmente para a linha de comando, mas com ligações a uma ampla gama de linguagens de programação (Java, Node.js, php, ...) e até mesmo disponíveis no navegador via jq-web .
Aqui estão algumas ilustrações baseadas na pergunta original, que deu esse JSON como exemplo:
sintaxe jq estende a sintaxe JSON
Toda expressão JSON é uma expressão jq válida e expressões como
[1, (1+1)]
e {"a": (1 + 1)} `ilustram como o jq estende a sintaxe JSON.Um exemplo mais útil é a expressão jq:
qual, dado o valor JSON
{"a":1, "b":2, "c": 3}
, avalia para{"a":1, "b":2}
.fonte
O
array.filter()
método interno torna obsoleta a maioria dessas chamadas bibliotecas de consultas javascriptVocê pode colocar quantas condições dentro do delegado puder imaginar: comparação simples, iniciaCom, etc. Não testei, mas você provavelmente poderia aninhar filtros também para consultar coleções internas.
fonte
array.filter()
faz parte do JavaScript, não do JSON.Se você estiver usando .NET, o Json.NET suporta consultas LINQ na parte superior do JSON. Este post tem alguns exemplos. Ele suporta filtragem, mapeamento, agrupamento, etc.
fonte
O ObjectPath é uma linguagem de consulta simples e de grande largura para documentos JSON de estrutura complexa ou desconhecida. É semelhante ao XPath ou JSONPath, mas muito mais poderoso graças a cálculos aritméticos incorporados, mecanismos de comparação e funções internas.
A versão Python é madura e usada na produção. JS ainda está na versão beta.
Provavelmente, em um futuro próximo, forneceremos uma versão Javascript completa. Também queremos desenvolvê-lo ainda mais, para que ele possa servir como uma alternativa mais simples às consultas do Mongo.
fonte
Outra maneira de analisar isso seria usar o mongoDB Você pode armazenar seu JSON no mongo e consultá-lo através da sintaxe de consulta do mongodb.
fonte
OK, este post é um pouco antigo, mas ... se você quiser fazer consultas semelhantes a SQL em JSON nativo (ou objetos JS) em objetos JS, dê uma olhada em https://github.com/deitch/searchjs
É uma linguagem jsql escrita inteiramente em JSON e uma implementação de referência. Você pode dizer: "Quero encontrar todos os objetos em uma matriz que tenham name ===" John "&& age === 25 como:
A implementação de referência searchjs funciona no navegador e também em um pacote npm do nó
Também pode fazer coisas como junções complexas e negação (NÃO). Ignora nativamente o caso.
Ainda não faz somatório ou conta, mas provavelmente é mais fácil fazê-lo lá fora.
fonte
Aqui estão algumas bibliotecas javascript simples que também farão o truque:
jFunk é uma linguagem de consulta em andamento, com uma sintaxe semelhante aos seletores CSS / jQuery. Parecia promissor, mas não teve nenhum desenvolvimento além do comprometimento inicial.
(adicionado em 2014): a ferramenta de linha de comando jq tem uma sintaxe pura, mas infelizmente é uma biblioteca de arquivos de configuração. Exemplo de uso:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
fonte
No MongoDB , é assim que funcionaria (no shell mongo, existem drivers para um idioma de sua escolha).
Os três primeiros comandos inserem os dados em sua coleção. (Basta iniciar o
mongod
servidor e conectar-se aomongo
cliente.)Os próximos dois processam os dados.
$match
filtros,$group
aplica osum
elist
, respectivamente.fonte
O SpahQL é o mais promissor e bem pensado dentre eles, até onde eu sei. Eu recomendo dar uma olhada.
fonte
Acabei de terminar uma versão liberável de uma JS-lib do lado do cliente (defiant.js) que faz o que você está procurando. Com o defiant.js, é possível consultar uma estrutura JSON com as expressões XPath com as quais você está familiarizado (sem novas expressões de sintaxe como no JSONPath).
Exemplo de como funciona (veja no navegador aqui http://defiantjs.com/defiant.js/demo/sum.avg.htm ):
Como você pode ver, o DefiantJS estende o objeto global JSON com uma função de pesquisa e a matriz retornada é entregue com funções agregadas. O DefiantJS contém algumas outras funcionalidades, mas essas estão fora do escopo deste assunto. Em qualquer lugar, você pode testar a lib com um XPath Evaluator do cliente. Acho que as pessoas não familiarizadas com o XPath acharão esse avaliador útil.
http://defiantjs.com/#xpath_evaluator
Mais informações sobre defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js
Espero que você ache útil ... Atenciosamente
fonte
O Google tem um projeto chamado lovefield ; acabei de descobrir sobre isso e parece interessante, apesar de estar mais envolvido do que apenas colocar sublinhado ou lodash.
https://github.com/google/lovefield
Outra entrada recente interessante neste espaço chamada jinqJs .
http://www.jinqjs.com/
Analisando brevemente os exemplos , parece promissor e o documento da API parece estar bem escrito.
fonte
Vou enfatizar a noção de apenas usar seu próprio javascript, mas para algo um pouco mais sofisticado, você pode olhar para os dados do dojo . Não o utilizou, mas parece que fornece aproximadamente o tipo de interface de consulta que você está procurando.
fonte
A implementação atual do Jaql tem como alvo o processamento de grandes dados usando um cluster Hadoop, portanto, pode ser mais do que você precisa. No entanto, ele é executado facilmente sem um cluster do Hadoop (mas ainda exige que o código do Hadoop e suas dependências sejam compilados, os quais geralmente são incluídos). Uma pequena implementação do Jaql que poderia ser incorporada em Javascript e no navegador seria uma ótima adição ao projeto.
Seus exemplos acima são facilmente escritos em jaql:
Claro, também há muito mais. Por exemplo:
O Jaql pode ser baixado / discutido em http://code.google.com/p/jaql/
fonte
Você também pode usar o Underscore.js, que é basicamente uma biblioteca de facas suíças para manipular coleções. Usando
_.filter
,_.pluck
,_.reduce
você pode fazer SQL-como consultas.O Underscore.js funciona no lado do cliente e no servidor e é uma biblioteca notável.
Você também pode usar o Lo-Dash, que é um fork do Underscore.js com melhores desempenhos.
fonte
Sempre que possível, eu mudaria todas as consultas para o back-end no servidor (para o banco de dados SQL ou outro tipo de banco de dados nativo). O motivo é que será mais rápido e otimizado para fazer a consulta.
Eu sei que o jSON pode ser autônomo e pode haver +/- para ter uma linguagem de consulta, mas não vejo a vantagem se você estiver recuperando dados do back-end para um navegador, como na maioria dos casos de uso do JSON. Consulte e filtre no back-end para obter os dados mais pequenos necessários.
Se, por qualquer motivo, você precisar consultar no front-end (principalmente em um navegador), sugiro apenas o uso do array.filter (por que inventar outra coisa?).
Dito isto, o que eu acho que seria mais útil é uma API de transformação para json ... eles são mais úteis, pois depois que você tiver os dados, poderá exibi-los de várias maneiras. No entanto, novamente, você pode fazer muito disso no servidor (que pode ser muito mais fácil de escalar) do que no cliente - SE você estiver usando o servidor <--> modelo de cliente.
Apenas meus 2 centavos vale a pena!
fonte
Confira https://github.com/niclasko/Cypher.js (observação: eu sou o autor)
É uma implementação Javascript de dependência zero da linguagem de consulta do banco de dados de gráficos Cypher, juntamente com um banco de dados de gráficos. É executado no navegador (testado com Firefox, Chrome, IE).
Com relevância para a pergunta. Pode ser usado para consultar pontos de extremidade JSON:
Aqui está um exemplo de consulta a um documento JSON complexo e de análise:
Exemplo de consulta JSON Cypher.js
fonte
PythonQL oferece uma sintaxe embutido que IMHO é uma melhoria em SQL, principalmente porque
group
,window
,where
,let
, etc, podem ser livremente misturados.Este código mostra duas respostas diferentes para sua pergunta, dependendo da sua necessidade de lidar com toda a estrutura ou apenas com o valor. A execução fornece o resultado esperado.
fonte
Você poderia usar
linq.js
.Isso permite usar agregações e seleções de um conjunto de dados de objetos, como outros dados de estruturas.
fonte