Al buscar elementos en matrices y hashes JSON complejos, como:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
¿Hay algún tipo de lenguaje de consulta que pueda usar para encontrar un artículo in [0].objects where id = 3
?
javascript
json
xpath
xquery
Naftuli Kay
fuente
fuente
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
que contiene su objeto JSON, escribiría:jsel(data).select("//*[@id=3]")
y devolvería el objeto que contiene la clave de identificación con 3.Respuestas:
Sí, se llama JSONPath . La fuente ahora está en GitHub .
También está integrado en DOJO .
fuente
Creo que JSONQuery es un superconjunto de JSONPath y, por lo tanto, lo reemplaza en dojo . Luego también está RQL .
De la documentación del Dojo:
JSONselect tiene otro punto de vista sobre la pregunta (como un selector CSS, en lugar de XPath) y tiene una implementación de JavaScript .
fuente
Otras alternativas que conozco son
HTH
fuente
Para resumir algunas de las opciones actuales para atravesar / filtrar datos JSON, y proporcionar algunos ejemplos de sintaxis ...
JSPath
.automobiles{.maker === "Honda" && .year > 2009}.model
json: select () (inspirado más en selectores CSS)
.automobiles .maker:val("Honda") .model
JSONPath (inspirado más en XPath)
$.automobiles[?(@.maker='Honda')].model
Creo que JSPath se ve mejor, así que intentaré integrarlo con mi aplicación AngularJS + CakePHP.
(Originalmente publiqué esta respuesta en otro hilo, pero pensé que sería útil aquí también).
fuente
Intenta usar JSPath
JSPath es un lenguaje específico de dominio (DSL) que le permite navegar y encontrar datos dentro de sus documentos JSON. Con JSPath, puede seleccionar elementos de JSON para recuperar los datos que contienen.
JSPath para JSON como un XPath para XML.
Está muy optimizado tanto para Node.js como para los navegadores modernos.
fuente
XQuery se puede utilizar para consultar JSON, siempre que el procesador ofrezca compatibilidad con JSON. Este es un ejemplo sencillo de cómo BaseX se puede utilizar para buscar objetos con "id" = 1:
fuente
jq define un lenguaje de consulta J SON q que es muy similar a JSONPath; consulte https://github.com/stedolan/jq/wiki/For-JSONPath-users
Asumiré que esto significa: encuentre todos los objetos JSON bajo la clave especificada con id == 3, sin importar dónde pueda estar el objeto. Una consulta jq correspondiente sería:
donde "|" es el operador de tubería (como en las tuberías de shell de comando), y donde el segmento ".. | objetos" corresponde a "sin importar dónde pueda estar el objeto".
Los conceptos básicos de jq son en gran medida obvios o intuitivos o al menos bastante simples, y la mayoría del resto es fácil de aprender si está familiarizado con las tuberías de shell de comandos. Las preguntas frecuentes de jq tienen punteros a tutoriales y similares.
jq también es como SQL porque admite operaciones CRUD, aunque el procesador jq nunca sobrescribe su entrada. jq también puede manejar flujos de entidades JSON.
Otros dos criterios que puede considerar al evaluar un lenguaje de consulta orientado a JSON son:
fuente
Defiant.js también se ve muy bien, aquí hay un ejemplo simple:
fuente
Parece que Json Pointer también está recibiendo un apoyo cada vez mayor.
fuente
Jsel es impresionante y se basa en un verdadero motor XPath. Le permite crear expresiones XPath para encontrar cualquier tipo de datos de JavaScript, no solo objetos (cadenas también).
Puede crear esquemas y mapeos personalizados para darle un control completo sobre cómo sus datos son transitables por el motor XPath. Un esquema es una forma de definir cómo los elementos, elementos secundarios, atributos y valores de nodo se definen en sus datos. Luego puedes crear tus propias expresiones para adaptarlas.
Dado que tenía una variable llamada
data
que contenía el JSON de la pregunta, podría usar jsel para escribir:Esto devolverá cualquier nodo con un
id
atributo de 3. Un atributo es cualquier valor primitivo (cadena, número, fecha, expresión regular) dentro de un objeto.fuente
ObjectPath es un lenguaje de consulta similar a XPath o JSONPath, pero mucho más potente gracias a los cálculos aritméticos integrados, los mecanismos de comparación y las funciones integradas. Ver la sintaxis:
Encuentra en la tienda todos los zapatos de color rojo y precio inferior a 50
$ .. zapatos. * [el color es "rojo" y el precio <50]
fuente
@Naftule: con "defiant.js", es posible consultar una estructura JSON con expresiones XPath. Echa un vistazo a este evaluador para tener una idea de cómo funciona:
http://www.defiantjs.com/#xpath_evaluator
A diferencia de JSONPath, "defiant.js" ofrece el soporte a gran escala de la sintaxis de consulta, de XPath en estructuras JSON.
El código fuente de defiant.js se puede encontrar aquí:
https://github.com/hbi99/defiant.js
fuente
JMESPath parece ser muy popular en estos días (a partir de 2020) y aborda una serie de problemas con JSONPath. Está disponible para muchos idiomas.
fuente
Si eres como yo y solo quieres hacer búsquedas basadas en rutas, pero no te importa el XPath real, lodash
_.get()
puede funcionar. Ejemplo de lodash docs:fuente
Probar esto - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Es una implementación muy simple en una línea similar de xpath para xml. Son nombres como jpath.
fuente