Преобразуйте JSON и сделайте его читабельным с помощью jq

Нотация объектов JavaScript (JSON) – один из самых популярных форматов данных в мире. Он имеет широкую поддержку и простую спецификацию. С ним легко работать на многих языках программирования, особенно на тех, которые ориентированы на веб-разработку.

Но ручная проверка данных JSON остается затруднительной. Несмотря на то, что это текстовый формат, удобочитаемый человеком, набор данных JSON может содержать огромные объемы данных. Источники не всегда форматируют JSON в удобной для чтения форме.

java Инструмент jq позволяет пользователям форматировать, фильтровать и преобразовывать данные JSON.

Что такое jq?

Поскольку это инструмент командной строки , вы обычно будете использовать jq, вводя команды в терминал. Также имеется отличная онлайн-площадка, о которой мы подробнее расскажем ниже.

Обычная работа связана с фильтрами и применением фильтра к некоторому входному JSON. Вы можете использовать jq для извлечения одного элемента из множества. Или вы можете удалить определенные поля из каждого элемента в наборе, упростив данные. Вы даже можете выполнять сложные операции, чтобы преобразовать ввод в другую форму.

Как скачать и установить jq

Программа jq не имеет внешних зависимостей, а это означает, что ее очень легко начать. Начните с загрузки исполняемого двоичного файла для Linux, macOS или Windows с помощью кнопки на домашней странице jq . После того, как вы загрузили программу, вы можете запустить ее прямо из командной строки. Возможно, вы захотите переименовать его ( mv jq-osx-amd64 jq ) для удобства, и вам может потребоваться сделать его исполняемым ( chmod + x jq ).

Подтвердите, что вы можете запустить jq, выполнив его из командной строки без аргументов:

 $ ./jq

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

 jq - commandline JSON processor [version 1.6]

Если вы боретесь с вышеуказанным подходом, есть альтернативы. Программное обеспечение jq поддерживает общие менеджеры пакетов, и вы всегда можете поэкспериментировать с онлайн-песочницей.

Базовое использование jq

Стандартное использование:

 jq [options] <jq filter> [file...]

Так, например:

 $ jq '.' data.json

Вы также можете передать ввод через другую команду, например:

 $ echo '{"name":"john"}' | jq '.'
{
"name": "john"
}

Это наиболее полезно, когда, например, первая команда является чем-то вроде вызова curl, который может извлекать данные JSON из веб-службы.

Фильтра показано в этих примерах является самым простым возможно,. (точка) , которая печатает ввод в предварительно заданной форме. Это уже довольно полезно, но фильтры jq предоставляют гораздо больше возможностей, чем это.

Как применить базовые фильтры к JSON с помощью jq

Фильтр jq немного похож на селектор CSS или выражение XPATH. Это одно длинное выражение, состоящее из более мелких частей. Полный фильтр может показаться сложным, но как только вы изучите основы, каждая часть станет понятной.

Работа с объектами

Вы можете получить значение свойства объекта, используя синтаксис .property :

 $ echo '{"name":"john"}' | jq '.name'
"john"

Это может быть связано с доступом к глубоко вложенным структурам:

 $ echo '{"name":{"first":"john","last":"smith"}}' | jq '.name.last'
"smith"

Работа с массивами

Простейшая операция с массивом возвращает один элемент через его индекс:

 $ echo '[1,2,3]' | jq '.[2]'
3

Обратите внимание, что, как и в большинстве языков программирования, jq индексирует массивы, начиная с позиции 0. Вы также можете разрезать подмассив, используя этот синтаксис:

 $ echo '[1,2,3]' | jq '.[1:3]'
[
2,
3
]

Без индекса внутри квадратных скобок jq преобразует одно значение массива в его собственное содержимое в виде нескольких значений:

 $ echo '[1,2,3]' | jq '.[]'
1
2
3

Это важный метод объединения фильтров в цепочку, который мы покажем позже.

Дополнительные расширенные функции

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

Эти функции делают возможным расширенное использование, хотя и сложное. Но jq имеет некоторые встроенные функции, такие как функции и операторы, которые помогают даже в простых задачах. Вот пример:

 $ echo '[2,4,8]' | jq 'add / length'
4.666666666666667

Этот фильтр подает входные данные как в функции сложения, так и в функции длины , разделяя результаты. В процессе работы он вычисляет среднее значение массива чисел.

Оператор деления также может воздействовать на строки, чтобы разделить их на основе разделителя:

 $ echo '"Just testing"' | jq '. / " "'
[
"Just",
"testing"
]

Функция select фильтрует массив, сохраняя только те элементы, которые проходят заданное ограничение:

 $ echo '[2,4,8]' | jq '.[] | select(. >= 3)'
4
8

Обратите внимание, что это также пример оператора конвейера jq ( | ), который похож на канал оболочки. Он передает результат своего левого фильтра в качестве входных данных для правого фильтра.

Функция карты очень полезна при работе с массивами. Он выполняет операцию с каждым элементом массива, а не со всем массивом:

 $ echo '[1,2,3]' | jq 'map(.+1)'
[
2,
3,
4
]

Вы часто будете использовать его вместе с select, например

 $ echo '[2,4,8]' | jq 'map(select(. >= 3))'
[
4,
8
]

Собираем все вместе: практический пример jq

Поскольку jq обрабатывает любой действительный JSON, переданный ему по конвейеру, вы можете отправить его вывод с помощью команды curl . Это позволяет вам получить JSON из URL-адреса и немедленно обработать его в командной строке:

JSON Feed – это альтернатива JSON форматам RSS и Atom. Сайт NPR – один из примеров, который поддерживает JSON Feed, но его трудно просматривать из источника и содержит много данных:

Сразу вы можете увидеть, насколько проще их читать, получив эти данные и пропустив их через jq:

 $ curl -s https://feeds.npr.org/1019/feed.json | jq '.'

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

 $ curl -s https://feeds.npr.org/1019/feed.json |
jq '.items | .[] |
select(
.date_published |
.[0:19] + "Z" |
fromdate |
strftime("%a") == "Tue"
) |
{id: .id, title:.title, date:.date_published}'

После выбора свойства items этот фильтр использует . [] Для перебора каждого элемента. Основная часть фильтра использует функцию выбора, чтобы сохранить только те сообщения со значением date_published, у которых рабочий день ( strftime ("% a") ) – Вт . Функция strftime требует даты в очень специфическом формате, которую создает фильтр . [0:19] + "Z" .

После выбора желаемых элементов последний фильтр строит для каждого из них объект с обязательными полями. Обратите внимание, что каждый раз, когда фид меняется, результаты будут отличаться. Вот пример, взятый на момент публикации:

 {
"id": "959667930",
"title": "Deplatforming: Not A First Amendment Issue, But Still A Tough Call For Big Tech",
"date": "2021-01-26T17:00:00-05:00"
}
{
"id": "960679189",
"title": "My Pillow CEO Mike Lindell Permanently Suspended From Twitter",
"date": "2021-01-26T10:17:15-05:00"
}
{
"id": "960220477",
"title": "Is Your 401(k) Colluding To Make Cereal More Expensive?",
"date": "2021-01-26T06:31:24-05:00"
}

См. Также: Анализ JSON Python: простое руководство.

Как обрабатывать JSON в Интернете с помощью jqplay

Если вы хотите попробовать jq перед его загрузкой, jqplay – идеальное место для начала. Через простой интерфейс сайт позволяет вам ввести образец JSON и фильтр, а затем просмотреть результат.

Это также позволяет вам опробовать несколько различных вариантов. К ним относятся –compact-output (для удаления пробелов) и –null-input (для отображения результата при отсутствии ввода).

Интерфейс также включает в себя очень полезный раздел шпаргалки. Вот скриншот предыдущего длинного примера :

Обратите внимание, что, как и в случае с этой ссылкой, вы также можете поделиться примерами через URL-адрес.

Используйте jq для чтения и управления данными JSON

Вы можете найти полную информацию о jq в учебнике и руководстве, которые находятся на веб-сайте jq. Сама программа предлагает ограниченный объем помощи с помощью параметра –help .

Если вы хотите выполнить базовые фильтры и преобразования или прочитать большой кусок JSON, jq – ценный инструмент.