Есть ли язык запросов для JSON? - PullRequest
202 голосов
/ 22 апреля 2009

Существует ли (примерно) 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 по мере продвижения вперед и дальше. (Хорошо, я знаю, что это немного глупый аргумент, но вы поняли идею ..)

Ответы [ 20 ]

80 голосов
/ 24 апреля 2009

Конечно, как насчет:

Кажется, что все они в процессе разработки, но работают в некоторой степени. Они также похожи на XPath и XQuery концептуально; хотя XML и JSON имеют разные концептуальные модели (иерархическая или объектная / структурная).

РЕДАКТИРОВАТЬ Сентябрь 2015: На самом деле теперь существует стандарт JSON Pointer , который позволяет очень простой и эффективный обход содержимого JSON. Он не только формально указан, но и поддерживается многими библиотеками JSON. Поэтому я бы назвал это действительно полезным стандартом, хотя из-за его ограниченной выразительности он может или не может считаться языком запросов как таковым.

46 голосов
/ 29 апреля 2009

Я бы порекомендовал мой проект, над которым я работаю, под названием jLinq . Я ищу отзывы, поэтому мне было бы интересно услышать, что вы думаете.

If позволяет писать запросы, аналогичные тем, которые вы делаете в LINQ ...

var results = jLinq.from(records.users)

    //you can join records
    .join(records.locations, "location", "locationId", "id")

    //write queries on the data
    .startsWith("firstname", "j")
    .or("k") //automatically remembers field and command names

    //even query joined items
    .equals("location.state", "TX")

    //and even do custom selections
    .select(function(rec) {
        return {
            fullname : rec.firstname + " " + rec.lastname,
            city : rec.location.city,
            ageInTenYears : (rec.age + 10)
        };
    });

Он также полностью расширяемый!

Документация все еще находится в стадии разработки, но вы все еще можете попробовать ее онлайн.

32 голосов
/ 18 октября 2011

Обновление: XQuery 3.1 может запрашивать либо XML, либо JSON, либо оба вместе. И XPath 3.1 может тоже.

Список растет:

9 голосов
/ 06 сентября 2015

jmespath работает действительно довольно легко и хорошо, http://jmespath.org/ Он используется Amazon в интерфейсе командной строки AWS, поэтому он должен быть достаточно стабильным.

8 голосов
/ 17 февраля 2012

Встроенный метод array.filter() делает большинство из этих так называемых библиотек запросов javascript устаревшими

Вы можете поместить в делегат столько условий, сколько вы можете себе представить: простое сравнение, старты с и т. Д. Я не проверял, но вы, вероятно, могли бы также использовать фильтры для запросов к внутренним коллекциям.

7 голосов
/ 23 июня 2013

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

Example

Версия Python является зрелой и используется в производстве. JS все еще в бета-версии.

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

6 голосов
/ 04 марта 2018

jq - это J SON q пользовательский язык, в основном предназначенный для командной строки, но с привязками к широкому спектру языков программирования (Java, node.js, php, ...) и даже доступны в браузере через jq-web .

Вот несколько иллюстраций, основанных на исходном вопросе, которые привели этот JSON в качестве примера:

 [{"x": 2, "y": 0}}, {"x": 3, "y": 1}, {"x": 4, "y": 1}]

СУММА (X) ГДЕ Y> 0 (будет равно 7)

map(select(.y > 0)) | add

СПИСОК (X) ГДЕ Y> 0 (будет равно [3,4])

map(.y > 0)

Синтаксис jq расширяет синтаксис JSON

Каждое выражение JSON является допустимым выражением jq, а такие выражения, как [1, (1+1)] и {"a": (1 + 1)} `, иллюстрируют, как jq расширяет синтаксис JSON.

Более полезным примером является выражение jq:

{a,b}

, которое, учитывая значение JSON {"a":1, "b":2, "c": 3}, оценивается как {"a":1, "b":2}.

6 голосов
/ 08 ноября 2012

Другой способ посмотреть на это - использовать mongoDB . Вы можете сохранить свой JSON в mongo, а затем запросить его через синтаксис запроса mongodb.

6 голосов
/ 26 апреля 2009

Если вы используете .NET, то Json.NET поддерживает запросы LINQ поверх JSON. Этот пост имеет несколько примеров. Поддерживает фильтрацию, отображение, группировку и т. Д.

3 голосов
/ 11 августа 2011

ОК, этот пост немного устарел, но ... если вы хотите сделать SQL-подобный запрос в нативном JSON (или JS-объектах) для JS-объектов, взгляните на https://github.com/deitch/searchjs

Это и язык jsql, полностью написанный на JSON, и эталонная реализация. Вы можете сказать: «Я хочу найти все объекты в массиве с именем ===« Джон »&& age === 25 как:

{name:"John",age:25,_join:"AND"}

Ссылочная реализация searchjs работает как в браузере, так и в виде узла npm

npm install searchjs

Он также может делать такие вещи, как сложные объединения и отрицание (НЕ). Он изначально игнорирует регистр.

Он еще не суммирует и не подсчитывает, но, вероятно, легче сделать это снаружи.

...