javascript - tutorial - xpath navigation
¿Hay un equivalente JSON de XQuery/XPath? (14)
Al buscar elementos en arreglos 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 elemento in [0].objects where id = 3
?
¿Hay algún tipo de lenguaje de consulta ...
jq define un lenguaje J SON q uery que es muy similar a JSONPath - vea https://github.com/stedolan/jq/wiki/For-JSONPath-users
... [que] puedo usar para encontrar un elemento en [0] .objetos donde id = 3?
Asumiré que esto significa: encuentre todos los objetos JSON bajo la clave especificada con id == 3, sin importar dónde esté el objeto. Una consulta jq correspondiente sería:
.[0].objects | .. | objects | select(.id==3)
donde "|" es el operador de canalización (como en shell tubos de comando), y donde el segmento ".. | objetos" corresponde a "sin importar dónde esté el objeto".
Los conceptos básicos de jq son en gran parte 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 comandos. El FAQ jq tiene punteros a tutoriales y similares.
jq también es como SQL, ya que admite operaciones CRUD, aunque el procesador jq nunca sobrescribe su entrada. jq también puede manejar flujos de entidades JSON.
Otros dos criterios que podría considerar al evaluar un lenguaje de consulta orientado a JSON son:
- ¿Soporta expresiones regulares? (jq 1.5 tiene soporte completo para expresiones regulares PCRE)
- ¿Es Turing-completo? (Sí)
@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
Creo que JSONQuery es un superconjunto de JSONPath y, por lo tanto, lo reemplaza en el dojo . Luego está también RQL .
De la documentación del dojo:
JSONQuery es una versión extendida de JSONPath con características adicionales para seguridad, facilidad de uso y un conjunto completo de herramientas de consulta de datos que incluyen filtrado, búsqueda recursiva, clasificación, mapeo, selección de rango y expresiones flexibles con comparaciones de cadenas de comodines y varios operadores.
JSONselect tiene otro punto de vista sobre la pregunta (como selector de CSS, en lugar de XPath) y tiene una implementación de JavaScript .
Otras alternativas que conozco son
- Especificación JSONiq , que especifica dos subtipos de idiomas: uno que oculta los detalles XML y proporciona una sintaxis similar a JS, y otro que enriquece la sintaxis XQuery con constructores JSON y similares. Zorba implementa JSONiq.
- Corona , que se basa en MarkLogic, proporciona una interfaz REST para almacenar, administrar y buscar contenido XML, JSON, de texto y binario.
- MarkLogic 6 y MarkLogic posteriores proporcionan una interfaz REST similar a Corona fuera de la caja.
- MarkLogic 8 y MarkLogic posteriores admiten JSON de forma nativa en su entorno de XQuery y JavaScript del lado del servidor. Puede aplicar XPath en él.
HTH.
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 por los selectores de CSS)
.automobiles .maker:val("Honda") .model
JSONPath (inspirado más por 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 también sería útil aquí).
Pruebe 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.
Si eres como yo y solo quieres hacer búsquedas basadas en la ruta, pero no te importa el verdadero XPath, el _.get()
de _.get()
puede funcionar. Ejemplo de documentos lodash:
var object = { ''a'': [{ ''b'': { ''c'': 3 } }] };
_.get(object, ''a[0].b.c'');
// → 3
_.get(object, [''a'', ''0'', ''b'', ''c'']);
// → 3
_.get(object, ''a.b.c'', ''default'');
// → ''default''
Trate de usar JSPath
JSPath es un lenguaje específico del dominio (DSL) que le permite navegar y encontrar datos dentro de sus documentos JSON. Usando JSPath, puede seleccionar elementos de JSON para recuperar los datos que contienen.
JSPath para JSON como un XPath para XML.
Está fuertemente optimizado tanto para Node.js como para navegadores modernos.
XQuery se puede utilizar para consultar JSON, siempre que el procesador ofrezca soporte JSON. Este es un ejemplo sencillo de cómo se puede usar BaseX para encontrar objetos con "id" = 1:
json:parse(''[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [ "etc." ] }
]}
]'')//value[.//id = 1]
ObjectPath es un lenguaje de consulta similar a XPath o JSONPath, pero mucho más poderoso gracias a los cálculos aritméticos integrados, los mecanismos de comparación y las funciones integradas. Vea 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 es <50]
Parece que Json Pointer también está recibiendo cada vez más apoyo.
Defiant.js también se ve muy bien, aquí hay un ejemplo simple:
var obj = {
"car": [
{"id": 10, "color": "silver", "name": "Volvo"},
{"id": 11, "color": "red", "name": "Saab"},
{"id": 12, "color": "red", "name": "Peugeot"},
{"id": 13, "color": "yellow", "name": "Porsche"}
],
"bike": [
{"id": 20, "color": "black", "name": "Cannondale"},
{"id": 21, "color": "red", "name": "Shimano"}
]
},
search = JSON.search(obj, ''//car[color="yellow"]/name'');
console.log( search );
// ["Porsche"]
var reds = JSON.search(obj, ''//*[color="red"]'');
for (var i=0; i<reds.length; i++) {
console.log( reds[i].name );
}
// Saab
// Peugeot
// Shimano
github.com/dragonworx/jsel es increíble y está basado 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 asignaciones personalizados para darle un control completo sobre cómo el motor de XPath puede acceder a sus datos. Un esquema es una forma de definir cómo se definen los elementos, elementos secundarios, atributos y valores de nodo en sus datos. A continuación, puede crear sus propias expresiones para adaptarse.
Dado que tenía una variable llamada data
que contenía el JSON de la pregunta, podría usar jsel para escribir:
jsel(data).select("//*[@id=3]")
Esto devolverá cualquier nodo con un atributo de id
de 3. Un atributo es cualquier valor primitivo (cadena, número, fecha, expresión regular) dentro de un objeto.