Существует ли JSON-эквивалент XQuery / XPath?

при поиске элементов в сложных массивах JSON и хэшах, например:

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

есть ли какой-то язык запросов, который я могу использовать для поиска элемента in [0].objects where id = 3?

14 ответов


Да, это называется помощью jsonpath. Источник теперь включен GitHub.

Он также интегрирован в додзе.


Я думаю, что JSONQuery является надмножеством JSONPath и, таким образом заменяет его в dojo. Тогда есть еще атракционов rql.

из документации Dojo:

JSONQuery-это расширенная версия JSONPath с дополнительными функциями для безопасности, простоты использования и полного набора запросов данных инструменты, включая фильтрацию, рекурсивный поиск, сортировку, отображение, диапазон выделение и гибкие выражения со сравнениями строк подстановочных знаков и различные операторы.

JSONselect имеет другую точку зрения на вопрос (селектор CSS, а не XPath) и имеет реализация JavaScript.


другие альтернативы, о которых я знаю, являются

  1. JSONiq спецификация, которая определяет два подтипа языков: один, который скрывает XML-данные и предоставляет JS-подобный синтаксис, и один, который обогащает синтаксис XQuery конструкторами JSON и такими. Зорба реализует JSONiq.
  2. Корона, который строит поверх MarkLogic обеспечивает интерфейс REST для хранения, управления и поиска XML, JSON, текста и двоичных файлов содержание.
  3. MarkLogic 6 и позже обеспечивают аналогичный интерфейс REST, как Corona из коробки.
  4. MarkLogic 8 и более поздние версии поддерживают JSON изначально как в среде XQuery, так и на стороне сервера JavaScript. Вы можете применить XPath на нем.

HTH.


чтобы суммировать некоторые из текущих опций для обхода / фильтрации данных JSON и предоставить некоторые примеры синтаксиса...

  • JSPath
    .automobiles{.maker === "Honda" && .year > 2009}.model

  • json: select () (больше вдохновлен селекторами CSS)
    .automobiles .maker:val("Honda") .model

  • помощью jsonpath (вдохновленный больше XPath)
    $.automobiles[?(@.maker='Honda')].model

Я думаю, что JSPath выглядит лучше всего, поэтому я собираюсь попробуйте интегрировать его с моим приложением AngularJS + CakePHP.

(я первоначально разместил этот ответ в другой поток но подумал, что это будет полезно и здесь.)


попробуйте использовать JSPath

JSPath-это доменный язык (DSL), который позволяет перемещаться и находить данные в документах JSON. Используя JSPath, вы можете выбрать элементы JSON для извлечения данных, которые они содержат.

JSPath для JSON, как XPath для XML.

Он сильно оптимизирован как для узла.js и современные браузеры.


XQuery можно использовать для запроса JSON, при условии, что процессор предлагает поддержку JSON. Это простой пример того, как BaseX можно использовать для поиска объектов с " id " = 1:

json:parse('[
    { "id": 1, "name": "One", "objects": [
        { "id": 1, "name": "Response 1", "objects": [ "etc." ] }
    ]}
]')//value[.//id = 1]

"Дефаент".js выглядит также круто, вот простой пример:

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

Указатель Json Кажется, что тоже получает растущую поддержку.


Jsel является удивительным и основан на реальном движке XPath. Он позволяет создавать выражения XPath для поиска любых типов данных JavaScript, а не только объектов (строк).

вы можете создавать пользовательские схемы и сопоставления, чтобы дать вам полный контроль над тем, как ваши данные можно пройти с помощью движка XPath. Схема-это способ определения того, как элементы, дочерние элементы, атрибуты и значения узлов определяются в данных. Затем вы можете создать свои собственные выражения для подходить.

учитывая, что у вас была переменная data который содержал JSON из вопроса, Вы можете использовать jsel для записи:

jsel(data).select("//*[@id=3]")

это вернет любой узел с из 3. Атрибут-это любое примитивное (строка, число, дата, регулярное выражение) значение в объекте.


ObjectPath - это язык запросов, похожий на XPath или JSONPath, но гораздо более мощный благодаря встроенным арифметическим вычислениям, механизмам сравнения и встроенным функциям. См. синтаксис:

найти в магазине всю обувь красного цвета и цена менее 50

$..башмаки.*[цвет "красный" и цена


@Naftule-с "defiant.js", можно запросить структуру JSON с выражениями XPath. Проверьте этот оценщик, чтобы получить представление о том, как это работает:

http://www.defiantjs.com/#xpath_evaluator

В отличие от JSONPath, "defiant.js " обеспечивает полномасштабную поддержку синтаксиса запроса XPath в структурах JSON.

исходный код defiant.js можно найти здесь:
https://github.com/hbi99/defiant.js


есть ли какой-то язык запросов ...

jq не определяет Jсын query язык, который очень похож на JSONPath -- see https://github.com/stedolan/jq/wiki/For-JSONPath-users

... [что] я могу использовать, чтобы найти элемент [0].объекты, где id = 3?

Я предполагаю, что это означает: найти все объекты JSON под указанным ключом с id == 3, независимо от того где может быть объект. Соответствующий запрос jq будет:

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

где " | " - оператор трубы (как в командных оболочковых трубах) и где сегмент ".. | объектов" соответствует "независимо от того, где объект может быть".

основы jq в значительной степени очевидны или интуитивно понятны или, по крайней мере, довольно просты, а большинство остальных легко подобрать, если вы вообще знакомы с трубами командной оболочки. В jq не часто задаваемые вопросы ссылки на учебники и как.

jq также похож на SQL в том, что он поддерживает операции CRUD, хотя процессор jq никогда не перезаписывает его вход. jq также может обрабатывать потоки сущностей JSON.

два других критерия, которые вы могли бы рассмотреть при оценке JSON-ориентированного языка запросов:

  • поддерживает ли он регулярные выражения? (jq 1.5 имеет всестороннюю поддержку PCRE regex)
  • это Тьюринг-полный? (да)

Если вы похожи на меня и вы просто хотите, чтобы сделать путь на основе поиска, но не заботятся о реальной XPath в лодашь по _.get() может работать. Пример из 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'

попробуйте это - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java

Это очень простая реализация на аналогичной строке xpath для xml. Это имена, как jpath.