Búsqueda de sitios web

javascript - ¿Existe un equivalente en JSON de XQuery/XPath?


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

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

¿Existe algún tipo de lenguaje de consultas que pueda usar para encontrar un elemento en [0].objects donde id=3?

Respuesta #1

Sí, se llama JSONPath:

También está integrado en DOJO.

Respuesta #2

JMESPath es una biblioteca bastante madura con una especificación detallada y soporte para múltiples idiomas.

Ejemplos de sintaxis:
// Select a single item
people[1].firstName

// Select a slice of an array
people[0:5]

// Select all the first names
people[*].firstName

// Select all first names based on search term
people[?state=='VA'].firstName

// Count how many people are over 35
length(people[?age>`35`])

// Select only the name and age of people over 35
people[?age>`35`].{name: name, age: age}

// Join expressions together to sort and join elements into a string
people[?state == 'WA'].name | sort(@) | join(', ', @)

Hay muchos más ejemplos en vivo con los que puedes interactuar en la documentación.

La biblioteca de JS tiene 19 kb minimizada, por lo que posiblemente sea más grande que algunas, pero considerando las funciones extensas, podrías encontrar que vale la pena.

Otras opciones

También hay algunas otras opciones para recorrer/filtrar datos JSON, junto con algunos ejemplos de sintaxis para ayudarte a comparar...

  • JSPath
    .automóviles{.fabricante === "Honda" && .año > 2009}.modelo

  • json:select() (inspirado más en selectores CSS)
    .automobiles .maker:val("Honda") .model

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

Respuesta #3

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 de 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, ordenación, mapeo, selección por rango y expresiones flexibles con comparaciones de cadenas comodín y varios operadores.

JSONselect tiene otro punto de vista sobre la cuestión (similar a un selector CSS, en lugar de XPath) y tiene una implementación en JavaScript.

Respuesta #4

Otras alternativas que conozco son

  1. Especificación de JSONiq, que especifica dos subtipos de lenguajes: uno que oculta los detalles de XML y proporciona una sintaxis similar a JS, y otro que enriquece la sintaxis de XQuery con constructores de JSON y similares. Zorba implementa JSONiq.
  2. Corona, que se construye sobre MarkLogic, proporciona una interfaz REST para almacenar, gestionar y buscar contenido XML, JSON, de texto y binario.
  3. MarkLogic 6 y versiones posteriores proporcionan una interfaz REST similar a Corona lista para usar.
  4. MarkLogic 8 y versiones posteriores soportan JSON de manera nativa tanto en su entorno XQuery como en el de JavaScript del lado del servidor. Puedes aplicar XPath sobre él.

Espero que esto ayude.

Respuesta #5

Intenta usar JSPath

JSPath es un lenguaje específico de dominio (DSL) que te permite navegar y encontrar datos dentro de tus documentos JSON. Usando JSPath, puedes 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.

Respuesta #6

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

jq define un lenguaje de consulta JSON que es muy similar a JSONPath -- vea https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [que] puedo usar para encontrar un objeto en [0].objects donde id=3?

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

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

donde "|" es el operador de tubería (como en las tuberías de la línea de comandos), y donde el segmento ".. | objects" corresponde a "no importa dónde esté el objeto".

Lo básico de jq es en gran medida obvio o intuitivo o al menos bastante simple, y la mayor parte del resto es fácil de aprender si tienes alguna familiaridad con los pipes de la línea de comandos. Las preguntas frecuentes de jq tienen referencias a tutoriales y cosas por el estilo.

jq también es como SQL en el sentido de 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 desear considerar al evaluar un lenguaje de consulta orientado a JSON son:

  • ¿admite expresiones regulares? (jq 1.5 tiene soporte completo para expresiones regulares PCRE)
  • ¿Es Turing-completo? (sí)

Respuesta #7

XQuery se puede utilizar para consultar JSON, siempre que el procesador ofrezca soporte para 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]

Respuesta #8

Parece que Json Pointer también está obteniendo un mayor apoyo.

Artículos relacionados