jq (язык программирования)
Парадигмы | Чисто функциональное программирование , JSON -ориентированная обработка, неявное программирование. |
---|---|
Разработано | Стивен Долан |
Впервые появился | 21 августа 2012 г |
Стабильная версия | 1.7.1 [1]
/ 13 декабря 2023 г |
Язык реализации | джк: С гойк: Иди ответ: Ржавчина jqjq: jq |
Платформа | Кросс-платформенный [примечание 1] |
ТЫ | Кросс-платформенный [примечание 2] |
Лицензия | С [примечание 3] |
Веб-сайт | jqlang |
jq — это очень высокого уровня с лексической областью функциональный язык программирования , в котором каждое значение JSON является константой. jq поддерживает возврат и управление неограниченно длинными потоками данных JSON. Это связано с языками программирования Icon и Haskell . Язык поддерживает систему модулей на основе пространства имен и некоторую поддержку замыканий. В частности, функции и функциональные выражения могут использоваться в качестве параметров других функций.
Исходная реализация jq была на Haskell. [3] немедленно портированным на C. прежде чем быть
История
[ редактировать ]jq был создан Стивеном Доланом и выпущен в октябре 2012 года. [4] [5] Он был описан как «похожий на sed для данных JSON». [6] Поддержка регулярных выражений была добавлена в jq версии 1.5.
Программа-оболочка для jq под названием yq добавляет поддержку YAML , XML и TOML . Впервые он был выпущен в 2017 году. [7]
Реализация Go , gojq, была первоначально выпущена в 2019 году. [8] gojq существенно расширяет jq, включая поддержку YAML .
Реализация Rust , jaq, ставит своей целью более быструю и правильную реализацию jq, сохраняя при этом совместимость с jq в большинстве случаев. По состоянию на март 2024 года из целей проекта явно исключены некоторые расширенные функции jq, такие как модули, операторы в стиле SQL и потоковый анализатор очень больших документов JSON. [9]
Реализация jq , jqjq, была первоначально выпущена в 2022 году. jqjq, в частности, может запускаться сам по себе, имеет REPL и поддерживает eval.
Использование
[ редактировать ]Использование командной строки
[ редактировать ]jq обычно используется в командной строке и может использоваться с другими утилитами командной строки, такими как Curl . Вот пример, показывающий, как вывод curl
Команда может быть передана в фильтр jq для определения названий категорий, связанных с этой Википедии страницей :
$ curl 'https://en.wikipedia.org/w/api.php?action=parse&page=jq_(programming_language)&format=json' | jq '.parse.categories[]."*"'
Вывод, создаваемый этим конвейером, состоит из потока строк JSON, первые несколько из которых:
"Articles_with_short_description"
"Short_description_matches_Wikidata"
"Dynamically_typed_programming_languages"
"Functional_languages"
"Programming_languages"
"Programming_languages_created_in_2012"
"Query_languages"
"2012_software"
The curl
Команда выше использует API MediaWiki для этой страницы для создания ответа JSON.
Труба |
позволяет выводить curl
доступ к которому осуществляется с помощью jq, стандартного механизма оболочки Unix . [10]
Показанный фильтр jq является аббревиатурой конвейера jq:
.["parse"] | .["categories"] | .[] | .["*"]
Это соответствует вложенной структуре JSON, созданной вызовом curl
. Обратите внимание, что конвейер jq строится таким же образом с использованием |
символ как конвейер в стиле Unix.
Встроенное использование
[ редактировать ]Реализации C и Go предоставляют библиотеки, позволяющие встраивать функциональность jq в другие приложения и среды программирования.
Например, gojq интегрирован с SQLite , поэтому jq
функция доступна в операторах SQL . [11] Эта функция отмечена как
«детерминированный» и
поэтому может использоваться в командах «CREATE INDEX» . [12]
Режимы работы
[ редактировать ]jq по умолчанию действует как «редактор потока» для входных данных JSON. например, утилиту sed можно рассматривать как «потоковый редактор» для строк текста. Однако jq имеет несколько других режимов работы:
- он может обрабатывать входные данные из одного или нескольких источников как строки текста;
- он может собирать поток входных данных из указанного источника в массив JSON;
- он может анализировать входные данные JSON с помощью так называемого «потокового анализатора», который создает поток массивов [path, value] для всех «листовых» путей.
«Потоковый анализатор» особенно полезен, когда один или несколько Входные данные JSON слишком велики, чтобы поместиться в памяти, поскольку их требования к памяти обычно весьма малы. Например, для произвольно большого массива объектов JSON: пиковая потребность в памяти ненамного больше, чем требуется для обработки самого большого объект верхнего уровня.
Эти режимы работы можно, с некоторыми ограничениями, комбинировать.
Синтаксис и семантика
[ редактировать ]Типы
[ редактировать ]Каждое значение JSON само по себе является значением в jq, которое соответственно имеет типы, показанные в таблице ниже. [13] Реализации gojq и jaq различают целые и нецелые числа. Реализация gojq поддерживает целочисленную арифметику неограниченной точности , как и исходная реализация jq в Haskell.
Тип | Примеры |
---|---|
" число " |
|
"нить" |
|
"логическое значение" |
|
"множество" |
|
"объект" |
|
"нулевой" |
|
null
— это значение, как и любой другой скаляр JSON; это не указатель или «нулевой указатель».
nan
(соответствует NaN ) и infinite
(см. IEEE 754 ) — единственные два скаляра jq, которые не являются также значениями JSON.
Формы
[ редактировать ]Существуют специальные синтаксические формы для создания функций, условий, сокращения потока и системы модулей.
Фильтры
[ редактировать ]Вот пример, показывающий, как определить именованный параметризованный фильтр для форматирования целого числа в любой системе счисления. от 2 до 36 включительно. Реализация иллюстрирует неявное (или бесточечное) программирование :
# Use gojq for infinite precision integer arithmetic
def tobase($b):
def digit: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1];
def mod: . % $b;
def div: ((. - mod) / $b);
def digits: recurse( select(. >= $b) | div) | mod ;
select(2 <= $b and $b <= 36)
| [digits | digit] | reverse | add;
Следующий пример демонстрирует использование генераторов в классической словесной арифметической игре «ОТПРАВИ БОЛЬШЕ ДЕНЕГ»:
def send_more_money:
def choose(m;n;used): ([range(m;n+1)] - used)[];
def num(a;b;c;d): 1000*a + 100*b + 10*c + d;
def num(a;b;c;d;e): 10*num(a;b;c;d) + e;
first(
1 as $m
| 0 as $o
| choose(8;9;[]) as $s
| choose(2;9;[$s]) as $e
| choose(2;9;[$s,$e]) as $n
| choose(2;9;[$s,$e,$n]) as $d
| choose(2;9;[$s,$e,$n,$d]) as $r
| choose(2;9;[$s,$e,$n,$d,$r]) as $y
| select(num($s;$e;$n;$d) + num($m;$o;$r;$e) ==
num($m;$o;$n;$e;$y))
| [$s,$e,$n,$d,$m,$o,$r,$e,$m,$o,$n,$e,$y] );
Разбор грамматик выражений
[ редактировать ]Существует очень тесная связь между jq и формализмом грамматики выражений синтаксического анализа (PEG). [14] Эта связь проистекает из эквивалентности семи основных операций PEG и конструкций jq, показанных в следующей таблице.
Название операции PEG | Обозначение PEG | операция jq или def |
---|---|---|
Последовательность | e1 e2
|
e1 | e2
|
Заказной выбор | e1 / e2
|
e1 // e2
|
Ноль или больше | e*
|
def star(E): (E | star(E)) // . ;
|
Один или несколько | e+
|
def plus(E): E | (plus(E) // . );
|
Необязательный | e?
|
def optional(E): E // .;
|
И-предикат | &e
|
def amp(E): . as $in | E | $in;
|
Не-предикат | !e
|
def neg(E): select( [E] == [] );
|
Порты и варианты
[ редактировать ]gojq — это реализация «чистого Go» . Существует также реализация на Rust диалекта jq под названием jaq. [9] для которых денотатационная семантика . задана [15]
Примечания
[ редактировать ]- ^ Ни реализация jq на C, ни на Go не имеет каких-либо зависимостей во время выполнения. [2]
- ^ Включая Windows , Linux и macOS . Реализация Go может быть скомпилирована на любой платформе, поддерживающей Go. [2]
- ^ Реализация jq на языке C использует библиотеку десятичных чисел с плавающей запятой, известную как decNumber, которая лицензируется по лицензии ICU; и библиотека регулярных выражений Oniguruma, имеющая лицензию BSD. [2]
Ссылки
[ редактировать ]Библиография
[ редактировать ]- Янссенс, Йерун (2021). Наука о данных в командной строке . О'Рейли Медиа . ISBN 9781492087885 .
- Янссенс, Йерун (2014). Наука о данных в командной строке: взгляд в будущее с помощью проверенных временем инструментов . О'Рейли Медиа . ISBN 9781491947807 .
- Маррс, Том (2017). JSON в действии: практическая интеграция данных в Интернете . О'Рейли Медиа . ISBN 9781491982419 .
Другие
[ редактировать ]- ^ «Выпуск jq 1.7.1» .
- ^ Перейти обратно: а б с «Скачать jq» . jq . Проверено 6 января 2023 г.
- ^ https://github.com/jqlang/jq/commit/eca89acee00faf6e9ef55d84780e6eeddf225e5c
- ^ Янссенс 2014 .
- ^ "ДжК" . jq . Проверено 6 января 2023 г.
- ^ «как СЭД» . Архивировано из оригинала 14 апреля 2013 г.
- ^ "Релиз v2.0.0 · кислюк/yq" . Гитхаб .
- ^ «Выпуск v0.0.1 · itchyny/gojq» . Гитхаб .
- ^ Перейти обратно: а б «01mf02/jaq: клон jq, ориентированный на корректность, скорость и простоту» . Гитхаб . Проверено 6 марта 2024 г.
- ^ «Учебник» . jq . Проверено 6 января 2023 г.
- ^ "sqlite_jq" . Гитхаб .
- ^ "ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ" . Гитхаб .
- ^ "Руководство" . jq . Проверено 6 января 2023 г.
- ^ «ПЭГ» . ПЭГ .
- ^ Фербер, Майкл (2023). «Денотационная семантика и быстрый интерпретатор jq». arXiv : 2302.10576 [ cs.LO ].
Внешние ссылки
[ редактировать ]- домашняя страница jq
- gojq — реализация Pure Go
- jaq — реализация Rust
- jqjq — реализация jq
- jq часто задаваемые вопросы
- Awesome jq — тщательно подобранный список ресурсов, связанных с jq.
- Страница языка программирования jq на Rosetta Code. сайте проекта задач сравнительного программирования