Существует ли JSON-эквивалент XQuery / XPath?
при поиске элементов в сложных массивах JSON и хэшах, например:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
есть ли какой-то язык запросов, который я могу использовать для поиска элемента in [0].objects where id = 3
?
14 ответов:
Я думаю, что JSONQuery является надмножеством JSONPath и таким образом заменяет его в dojo. Тогда есть еще RQL.
из документации Dojo:
JSONQuery-это расширенная версия JSONPath с дополнительными функциями для обеспечения безопасности, простоты использования и полного набора запросов данных инструменты, включая фильтрацию, рекурсивный поиск, сортировку, отображение, диапазон выбор и гибкие выражения с подстановочными сравнениями строк и различные операторы.
JSONselect имеет другую точку зрения на вопрос (селектор CSS, а не XPath) и имеет реализация JavaScript.
другие альтернативы, о которых я знаю,
- JSONiq спецификация, которая определяет два подтипа языков: один, который скрывает детали XML и предоставляет JS-подобный синтаксис, и один, который обогащает синтаксис XQuery конструкторами JSON и такими. Зорба реализует JSONiq.
- Корона, который строит поверх MarkLogic обеспечивает интерфейс REST для хранения, управления и поиска XML, JSON, текста и двоичных файлов содержание.
- MarkLogic 6 и более поздно обеспечивают подобный интерфейс остальных как корона из коробки.
- 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.