Jump to content

jq (язык программирования)

jq
Символы «./jq» черным моноширинным шрифтом.
Официальный логотип JQ
Парадигмы Чисто функциональное программирование , JSON -ориентированная обработка, неявное программирование.
Разработано Стивен Долан
Впервые появился 21 августа 2012 г .; 11 лет назад ( 21 августа 2012 )
Стабильная версия
1.7.1 [1]  Отредактируйте это в Викиданных / 13 декабря 2023 г .; 7 месяцев назад ( 13 декабря 2023 г. )
Язык реализации джк: С
гойк: Иди
ответ: Ржавчина
jqjq: jq
Платформа Кросс-платформенный [примечание 1]
ТЫ Кросс-платформенный [примечание 2]
Лицензия С [примечание 3]
Веб-сайт jqlang .github .что /jq

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 имеет несколько других режимов работы:

  1. он может обрабатывать входные данные из одного или нескольких источников как строки текста;
  2. он может собирать поток входных данных из указанного источника в массив JSON;
  3. он может анализировать входные данные JSON с помощью так называемого «потокового анализатора», который создает поток массивов [path, value] для всех «листовых» путей.

«Потоковый анализатор» особенно полезен, когда один или несколько Входные данные JSON слишком велики, чтобы поместиться в памяти, поскольку их требования к памяти обычно весьма малы. Например, для произвольно большого массива объектов JSON: пиковая потребность в памяти ненамного больше, чем требуется для обработки самого большого объект верхнего уровня.

Эти режимы работы можно, с некоторыми ограничениями, комбинировать.

Синтаксис и семантика

[ редактировать ]

Каждое значение JSON само по себе является значением в jq, которое соответственно имеет типы, показанные в таблице ниже. [13] Реализации gojq и jaq различают целые и нецелые числа. Реализация gojq поддерживает целочисленную арифметику неограниченной точности , как и исходная реализация jq в Haskell.

поддерживаемых jq Сводка типов,
Тип Примеры
" число "
  • 3
  • 3.2
  • 1e6
  • nan
  • infinite
"нить"
  • "Hello"
  • "😐"
"логическое значение"
  • true
  • false
"множество"
  • [1, "2", {"mixed": "type"}, [3,4]]
"объект"
  • {"one": 1, "two": "2", "three": [3]}
"нулевой"
  • null

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 и эквивалентами 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]

Примечания

[ редактировать ]
  1. ^ Ни реализация jq на C, ни на Go не имеет каких-либо зависимостей во время выполнения. [2]
  2. ^ Включая Windows , Linux и macOS . Реализация Go может быть скомпилирована на любой платформе, поддерживающей Go. [2]
  3. ^ Реализация jq на языке C использует библиотеку десятичных чисел с плавающей запятой, известную как decNumber, которая лицензируется по лицензии ICU; и библиотека регулярных выражений Oniguruma, имеющая лицензию BSD. [2]

Библиография

[ редактировать ]
  • Янссенс, Йерун (2021). Наука о данных в командной строке . О'Рейли Медиа . ISBN  9781492087885 .
  • Янссенс, Йерун (2014). Наука о данных в командной строке: взгляд в будущее с помощью проверенных временем инструментов . О'Рейли Медиа . ISBN  9781491947807 .
  • Маррс, Том (2017). JSON в действии: практическая интеграция данных в Интернете . О'Рейли Медиа . ISBN  9781491982419 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 688448e9879e0d91d3416fca31893c7c__1714370100
URL1:https://arc.ask3.ru/arc/aa/68/7c/688448e9879e0d91d3416fca31893c7c.html
Заголовок, (Title) документа по адресу, URL1:
jq (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)