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


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

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

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

14 189

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 и более поздно обеспечивают подобный интерфейс остальных как корона из коробки.
  4. MarkLogic 8 и более поздние версии поддерживают JSON изначально как в своей среде XQuery, так и на стороне сервера JavaScript. Вы можете применить XPath на нем.

НТН.

чтобы суммировать некоторые текущие параметры для обхода / фильтрации данных 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]")

это вернет любой узел с id атрибут 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 определяет a Jсын qязык uery, который очень похож на JSONPath -- см. https://github.com/stedolan/jq/wiki/For-JSONPath-users

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

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

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

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

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

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

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

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

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