¿Hay un equivalente JSON de XQuery / XPath?


Al buscar elementos en matrices JSON complejas y hashes, como:

[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [
            // etc.
        }]
    }
]

¿Hay algún tipo de lenguaje de consulta que pueda utilizar para encontrar un elemento in [0].objects where id = 3?

Author: Naftuli Kay, 2011-12-13

14 answers

Sí, se llama JSONPath. La fuente está ahora en GitHub .

También está integrado en DOJO.

 109
Author: Mike Christensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-27 17:27:58

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:

JSONQuery es una versión extendida de JSONPath con características adicionales para mayor seguridad, facilidad de uso y un conjunto completo de consultas de datos herramientas que incluyen filtrado, búsqueda recursiva, clasificación, asignación, rango selección y expresiones flexibles con comparaciones de cadenas comodín y varios operador.

JSONselect tiene otro punto de vista sobre la pregunta (como selector CSS, en lugar de XPath) y tiene una implementación de JavaScript .

 20
Author: Brian Clozel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 12:40:02

Otras alternativas que conozco son

  1. Especificación JSONiq, que especifica dos subtipos de lenguajes: uno que oculta detalles XML y proporciona sintaxis similar a JS, y otro que enriquece la sintaxis XQuery con constructores JSON y similares. Zorba implementa JSONiq.
  2. Corona, que se basa en MarkLogic, proporciona una interfaz REST para almacenar, administrar y buscar contenido XML, JSON, Texto y binario.
  3. MarkLogic 6 y más tarde proporcionar una interfaz de DESCANSO similar como Corona fuera de la caja.
  4. MarkLogic 8 y versiones posteriores admiten JSON de forma nativa tanto en su entorno XQuery como en JavaScript del lado del servidor. Puede aplicar XPath en él.

HTH.

 15
Author: grtjn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-10 11:34:32

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 selectores CSS)
    .automobiles .maker:val("Honda") .model

  • JSONPath (inspirado más por XPath)
    $.automobiles[?(@.maker='Honda')].model

Creo que JSPath se ve mejor, así que voy a tratar de integrarlo con mi aplicación AngularJS + CakePHP.

(Yo originalmente publicado esta respuesta en otro hilo, pero pensé que sería útil aquí, también.)

 14
Author: Simon East,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:07

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 Nodo.js y navegadores modernos.

 13
Author: dfilatov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-14 20:23:47

XQuery se puede utilizar para consultar JSON, siempre que el procesador ofrezca soporte JSON. Este es un ejemplo sencillo de cómo BaseX se puede utilizar para encontrar objetos con " id " = 1:

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]
 9
Author: Christian Grün,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-12 22:32:24

Desafiante.js también se ve bastante 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
 7
Author: Epoc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-02 14:27:24

Json Pointer parece estar recibiendo un apoyo creciente también.

 6
Author: karlfreeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-29 11:52:29

Jsel es impresionante y está basado en un motor XPath real. Permite crear expresiones XPath para encontrar cualquier tipo de datos JavaScript, no solo objetos (también cadenas).

Puede crear esquemas y asignaciones personalizadas para darle un control completo sobre cómo se pueden recorrer sus datos con el motor XPath. Un esquema es una forma de definir cómo se definen los elementos, los hijos, los atributos y los valores de nodo en los datos. A continuación, puede crear sus propias expresiones para adaptarse.

Dado que habí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 id de 3. Un atributo es cualquier valor primitivo (cadena, número, fecha, expresión regular) dentro de un objeto.

 6
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 00:44:38

ObjectPath es un lenguaje de consulta similar a XPath o JSONPath, pero mucho más potente gracias a los cálculos aritméticos incrustados, 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

$..zapato.* [color es "rojo" y precio

 6
Author: Ela Bednarek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-17 18:40:53

@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

 4
Author: Hakan Bilgin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-02 12:58:21

¿hay algún tipo de lenguaje de consulta ...

Jq define un JSON query lenguaje que es muy similar a JSONPath see ver https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [que] Puedo utilizar para encontrar un elemento en [0].objetos donde id = 3?

Asumiré que esto significa: encuentra todos los objetos JSON bajo la clave especificada con id == 3, sin importar dónde esté el objeto. Una consulta jq correspondiente sería be:

.[0].objects | .. | objects | select(.id==3)

Donde " | "es el operador de tuberías (como en las tuberías de shell de comandos), y donde el segmento".. / objects "corresponde a" no importa 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 los tubos de comandos. El jq FAQ tiene punteros a tutoriales y similares.

Jq también es como SQL en que soporta operaciones CRUD, aunque el jq el procesador 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:

  • ¿soporta expresiones regulares? (jq 1.5 tiene soporte completo para PCRE regex)
  • ¿está Turing-completo? (yep)
 4
Author: peak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 11:34:43

Si eres como yo y solo quieres hacer búsquedas basadas en rutas, pero no te importa el XPath real, lodash's _.get() puede funcionar. Ejemplo de lodash docs:

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'
 1
Author: adittes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 19:47:07

Prueba 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.

 0
Author: Satyajit Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-29 17:06:09