При поиске элементов в сложных массивах и хешах JSON, например:
[
{ "id": 1, "name": "One", "objects": [
{ "id": 1, "name": "Response 1", "objects": [
// etc.
}]
}
]
Есть ли какой-то язык запросов, который я могу использовать, чтобы найти предмет in [0].objects where id = 3
?
javascript
json
xpath
xquery
Нафтули Кей
источник
источник
in(...).where(...).select(...)
): hugoware.net/Projects/jLinq .data
которая содержит ваш JSON-объект, вы должны написать:jsel(data).select("//*[@id=3]")
и он вернет объект, содержащий ключ id, с 3.Ответы:
Да, это называется JSONPath . Источник теперь на GitHub .
Он также интегрирован в DOJO .
источник
Я думаю, что JSONQuery является надмножеством JSONPath и поэтому заменяет его в dojo . Тогда есть также RQL .
Из документации Dojo:
JSONselect имеет другую точку зрения на этот вопрос (CSS-селектор, а не XPath) и имеет реализацию JavaScript .
источник
Другие известные мне альтернативы
НТН.
источник
Подведем итоги некоторых текущих опций обхода / фильтрации данных 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.
Он сильно оптимизирован как для Node.js, так и для современных браузеров.
источник
XQuery может использоваться для запроса JSON при условии, что процессор предлагает поддержку JSON. Это простой пример того, как BaseX может использоваться для поиска объектов с «id» = 1:
источник
JQ определяет J SON д язык uery , который очень похож на JSONPath - см https://github.com/stedolan/jq/wiki/For-JSONPath-users
Я предполагаю, что это означает: найти все объекты JSON под указанным ключом с id == 3, независимо от того, где объект может быть. Соответствующий JQ-запрос будет:
где "|" является оператором канала (как в каналах командной оболочки), и где сегмент ".. | objects" соответствует "независимо от того, где объект может быть".
Основы jq в основном очевидны, интуитивно понятны или, по крайней мере, довольно просты, а большинство остальных легко понять, если вы вообще знакомы с каналами командной оболочки. JQ FAQ содержит ссылки на учебные пособия и тому подобное.
jq также похож на SQL в том, что он поддерживает операции CRUD, хотя процессор jq никогда не перезаписывает свой ввод. jq также может обрабатывать потоки объектов JSON.
При оценке языка запросов, ориентированного на JSON, вы можете рассмотреть два других критерия:
источник
Defiant.js выглядит также довольно круто, вот простой пример:
источник
Json Pointer, похоже, тоже получает растущую поддержку.
источник
Jsel великолепен и основан на реальном движке XPath. Он позволяет создавать выражения XPath для поиска любого типа данных JavaScript, а не только объектов (также строк).
Вы можете создавать собственные схемы и сопоставления, чтобы дать вам полный контроль над тем, как ваши данные доступны для движка XPath. Схема - это способ определения того, как элементы, дочерние элементы, атрибуты и значения узлов определяются в ваших данных. Затем вы можете создавать свои собственные выражения, чтобы удовлетворить.
Учитывая, что у вас есть переменная,
data
которая содержит JSON из вопроса, вы можете использовать jsel для записи:Это вернет любой узел с
id
атрибутом 3. Атрибут - это любое примитивное значение (строка, число, дата, регулярное выражение) внутри объекта.источник
ObjectPath - это язык запросов, похожий на XPath или JSONPath, но гораздо более мощный благодаря встроенным арифметическим вычислениям, механизмам сравнения и встроенным функциям. Смотрите синтаксис:
Найти в магазине все туфли красного цвета и по цене менее 50
$ .. обувь. * [цвет "красный" и цена <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
источник
JMESPath, кажется, очень популярен в наши дни (с 2020 года) и решает ряд проблем с JSONPath. Это доступно для многих языков.
источник
Если вы похожи на меня и хотите просто выполнять поиск по пути, но не заботитесь о реальном XPath, lodash
_.get()
может работать. Пример из документации lodash:источник
Попробуйте это - https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Это очень простая реализация в аналогичной строке xpath для xml. Это имена как jpath.
источник