Существует ли (примерно) SQL или XQuery-подобный язык для запросов JSON?
Я имею в виду очень маленькие наборы данных, которые хорошо отображаются в JSON, где было бы неплохо легко отвечать на запросы, такие как «каковы все значения X, где Y> 3», или выполнять обычные операции типа SUM / COUNT.
Как полностью вымышленный пример, примерно так:
[{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]
SUM(X) WHERE Y > 0 (would equate to 7)
LIST(X) WHERE Y > 0 (would equate to [3,4])
Я думаю, что это будет работать как на стороне клиента, так и на стороне сервера, при этом результаты будут преобразованы в соответствующую структуру данных для конкретного языка (или, возможно, сохранены как JSON)
Быстрый поиск в Google позволяет предположить, что люди подумали об этом и реализовали несколько вещей ( JAQL ), но пока что не появилось стандартного использования или набора библиотек. Хотя каждая функция довольно проста для реализации самостоятельно, если кто-то уже сделал это правильно, я не хочу заново изобретать колесо.
Какие-либо предложения?
Редактировать: Это действительно может быть плохой идеей, или JSON может быть слишком универсальным форматом для того, о чем я думаю. Причина, по которой мне нужен язык запросов вместо того, чтобы просто выполнять функции суммирования / etc напрямую по мере необходимости, заключается в том, что я надеюсь построить запросы динамически основаны на пользовательском вводе. Вроде как аргумент, что «нам не нужен SQL, мы можем просто написать нужные нам функции». В конечном итоге это либо выходит из-под контроля, либо вы в конечном итоге пишете свою собственную версию SQL по мере продвижения вперед и дальше. (Хорошо, я знаю, что это немного глупый аргумент, но вы поняли ...)
источник
Ответы:
Конечно, как насчет:
Все они, кажется, немного в стадии разработки, но работают в некоторой степени. Они также похожи на XPath и XQuery концептуально; хотя XML и JSON имеют разные концептуальные модели (иерархическая или объектная / структурная).
РЕДАКТИРОВАТЬ Сентябрь 2015: На самом деле, теперь существует стандарт JSON Pointer, который позволяет очень простой и эффективный обход контента JSON. Он не только формально указан, но и поддерживается многими библиотеками JSON. Поэтому я бы назвал это действительно полезным стандартом, хотя из-за его ограниченной выразительности он может или не может считаться языком запросов как таковым.
источник
Я бы порекомендовал мой проект, над которым я работаю, под названием jLinq . Я ищу отзывы, поэтому мне было бы интересно услышать, что вы думаете.
Если позволяет вам писать запросы, похожие на то, как вы бы в LINQ ...
Это также полностью расширяемый!
Документация все еще находится в стадии разработки, но вы все еще можете попробовать ее онлайн.
источник
Обновление: XQuery 3.1 может запрашивать либо XML, либо JSON, либо оба вместе. И XPath 3.1 тоже может.
Список растет:
источник
jmespath работает довольно легко и хорошо, http://jmespath.org/ Он используется Amazon в интерфейсе командной строки AWS, поэтому он должен быть достаточно стабильным.
источник
jmespath
этот--query
параметр, но рекомендует использовать егоjq
для командной строки. docs.aws.amazon.com/cli/latest/userguide/…JQ является J SON д языком uery, в основном предназначен для командной строки , но с креплениями для широкого спектра языков программирования (Java, Node.js, PHP, ...) и даже доступных в браузере через JQ-сеть .
Вот несколько иллюстраций, основанных на оригинальном вопросе, который привел этот JSON в качестве примера:
Синтаксис JQ расширяет синтаксис JSON
Каждое выражение JSON является допустимым выражением jq, а такие выражения, как
[1, (1+1)]
и {"a": (1 + 1)} `, иллюстрируют, как jq расширяет синтаксис JSON.Более полезным примером является выражение jq:
который, учитывая значение JSON
{"a":1, "b":2, "c": 3}
, оценивается как{"a":1, "b":2}
.источник
Встроенный
array.filter()
метод делает большинство из этих так называемых библиотек запросов javascript устаревшимиВы можете поместить в делегат столько условий, сколько вы можете себе представить: простое сравнение, старты с и т. Д. Я не тестировал, но вы, вероятно, могли бы также вложить фильтры для запросов внутренних коллекций.
источник
array.filter()
является частью JavaScript, а не JSON.Если вы используете .NET, то Json.NET поддерживает запросы LINQ поверх JSON. Этот пост имеет несколько примеров. Поддерживает фильтрацию, отображение, группировку и т. Д.
источник
ObjectPath - это простой и лёгкий язык запросов для документов JSON сложной или неизвестной структуры. Он похож на XPath или JSONPath, но гораздо более мощный благодаря встроенным арифметическим вычислениям, механизмам сравнения и встроенным функциям.
Версия Python является зрелой и используется в производстве. JS все еще находится в бета-версии.
Вероятно, в ближайшее время мы предоставим полноценную версию Javascript. Мы также хотим развивать его дальше, чтобы он мог служить более простой альтернативой запросам Монго.
источник
Другой способ посмотреть на это - использовать mongoDB. Вы можете сохранить свой JSON в mongo, а затем запросить его с помощью синтаксиса запроса mongodb.
источник
Хорошо, этот пост немного старый, но ... если вы хотите сделать SQL-подобный запрос в нативном JSON (или JS-объектах) для JS-объектов, взгляните на https://github.com/deitch/searchjs
Это и язык jsql, написанный полностью на JSON, и эталонная реализация. Вы можете сказать: «Я хочу найти все объекты в массиве с именем ===« Джон »&& age === 25 как:
Ссылочная реализация searchjs работает в браузере так же, как и пакет npm узла
Это также может делать такие вещи, как сложные объединения и отрицание (НЕ). Это изначально игнорирует случай.
Это еще не делает суммирование или подсчет, но, вероятно, легче сделать те, кто снаружи.
источник
Вот несколько простых библиотек JavaScript, которые также сделают свое дело:
jFunk - это язык запросов в процессе, с синтаксисом, похожим на селекторы CSS / jQuery. Это выглядело многообещающе, но не имело никакого развития кроме его в начальном коммите.
(добавлено 2014): инструмент командной строки jq имеет аккуратный синтаксис, но, к сожалению, это библиотека ac. Пример использования:
< package.json jq '.dependencies | to_entries | .[] | select(.value | startswith("git")) | .key'
источник
В MongoDB именно так и будет работать (в оболочке mongo существуют драйверы для выбранного вами языка).
Первые три команды вставляют данные в вашу коллекцию. (Просто запустите
mongod
сервер и соединитесь сmongo
клиентом.)Следующие два обрабатывают данные.
$match
фильтры,$group
применяетsum
иlist
, соответственно.источник
Насколько я могу судить, SpahQL является наиболее перспективным и продуманным из них. Я настоятельно рекомендую проверить это.
источник
Я только что закончил выпускную версию клиентской JS-lib (defiant.js), которая делает то, что вы ищете. С помощью defiant.js вы можете запросить структуру JSON с помощью знакомых вам выражений XPath (нет новых синтаксических выражений, как в JSONPath).
Пример того, как это работает (см. Это в браузере здесь http://defiantjs.com/defiant.js/demo/sum.avg.htm ):
Как видите, DefiantJS расширяет глобальный объект JSON функцией поиска, а возвращаемый массив поставляется с агрегатными функциями. DefiantJS содержит несколько других функций, но они выходят за рамки этого предмета. В любом случае, вы можете протестировать библиотеку с помощью клиентского XPath Evaluator. Я думаю, что люди, не знакомые с XPath, сочтут этот оценщик полезным.
http://defiantjs.com/#xpath_evaluator
Дополнительная информация о defiant.js
http://defiantjs.com/
https://github.com/hbi99/defiant.js
Я надеюсь, что вы найдете это полезным ... С уважением
источник
У Google есть проект под названием lovefield ; только что узнал об этом, и это выглядит интересно, хотя это более сложный процесс, чем просто добавление подчеркивания или lodash.
https://github.com/google/lovefield
Еще одна интересная недавняя запись в этом пространстве называется jinqJs .
http://www.jinqjs.com/
Кратко рассмотрев примеры , это выглядит многообещающе, и документ API выглядит хорошо написанным.
источник
Я поддержу идею использования вашего собственного javascript, но для чего-то более сложного вы можете взглянуть на данные dojo . Не использовал его, но, похоже, он дает вам примерно тот интерфейс запроса, который вы ищете.
источник
Текущая реализация Jaql нацелена на обработку больших данных с использованием кластера Hadoop, так что это может быть больше, чем вам нужно. Тем не менее, он легко запускается без кластера Hadoop (но все же для его компиляции требуется код Hadoop и его зависимости, которые в основном включены). Небольшая реализация Jaql, которая может быть встроена в Javascript и браузер, будет отличным дополнением к проекту.
Ваши примеры выше легко написаны на jaql:
Конечно, есть и многое другое. Например:
Jaql можно скачать / обсудить по адресу http://code.google.com/p/jaql/.
источник
Вы также можете использовать Underscore.js, который является в основном библиотекой швейцарского ножа для управления коллекциями. Используя
_.filter
,_.pluck
,_.reduce
вы можете сделать SQL-подобных запросов.Underscore.js работает как на стороне клиента, так и на стороне сервера и является заметной библиотекой.
Вы также можете использовать Lo-Dash, который является форком Underscore.js с лучшими характеристиками.
источник
Когда бы ни было возможно, я бы переместил все запросы к серверной части сервера (к базе данных SQL или другому собственному типу базы данных). Причина в том, что это будет быстрее и более оптимизировано для выполнения запросов.
Я знаю, что jSON может быть автономным и может существовать +/- для языка запросов, но я не вижу преимущества, если вы извлекаете данные из серверной части в браузер, как в большинстве случаев использования JSON. Запросите и отфильтруйте на бэкэнде, чтобы получить как можно меньше нужных данных.
Если по какой-либо причине вам нужно сделать запрос на внешнем интерфейсе (в основном в браузере), то я бы предложил просто использовать array.filter (зачем придумывать что-то еще?).
Тем не менее, я думаю, что более полезным будет API преобразования для json ... они более полезны, поскольку, получив данные, вы можете захотеть их отобразить несколькими способами. Однако, опять же, вы можете сделать многое из этого на сервере (который может быть гораздо легче масштабировать), чем на клиенте - ЕСЛИ вы используете серверную <-> модель клиента.
Просто мои 2 пенса стоит!
источник
Проверьте https://github.com/niclasko/Cypher.js (примечание: я автор)
Это реализация Javascript с нулевой зависимостью языка запросов к базе данных графов Cypher вместе с базой данных графов. Он работает в браузере (протестировано с Firefox, Chrome, IE).
С актуальностью к вопросу. Может использоваться для запроса конечных точек JSON:
Вот пример запроса сложного документа JSON и выполнения анализа на нем:
Пример запроса JSON Cypher.js
источник
PythonQL предлагает встроенный синтаксис , который IMHO является улучшением по SQL, в основном потому , что
group
,window
,where
,let
и т.д. могут быть свободно перемешаны.Этот код показывает два разных ответа на ваш вопрос, в зависимости от вашей необходимости обрабатывать всю структуру или только значение. Выполнение дает вам ожидаемый результат.
источник
Вы могли бы использовать
linq.js
.Это позволяет использовать агрегаты и выборки из набора данных объектов, как данные других структур.
источник