Работаем с JSON через jq на примере Github API

Работаем с JSON через jq на примере Github API

no system is safe

Что же такое jq?

Jq похож на sed для данных JSON - вы можете использовать его для фильтрации, отображения и преобразования данных с той же легкостью, с которой это умеют делать sed, awk, grep и еще множество консольных утилит.

Меньше слов - больше дела!

Допустим, мы хотим получать совершенно с любого репозитория ссылку на скачивание релиза используя Github API. Пускай, этим репозиторием будет популярное дополнение для REHLDS - Metamod-r.

curl -s https://api.github.com/repos/theAsmodai/metamod-r/releases/latest | jq

Что же мы увидим? А увидим мы приятно отформатированный JSON c подсветкой элементов:

Чего стоит только эта особенность!

Чуть ниже видим assets. У него есть есть поле browser_download_url (к сожалению на скриншот не попало), которое имеет ссылку на прямое скачивание. Заметим, что assets у нас массив, поэтому нам нужно достать именно последний билд. Как это сделать?

curl -s https://api.github.com/repos/theAsmodai/metamod-r/releases/latest | jq -r ".assets[-1]"

Проводим ответ через пайп и таким образом, из ответа мы получаем элемент assets с -1 индексом (последний).

Да вы посмотрите что творит этот парень!!!

Видим нужный нам browser_download_url. Достаем его следующим образом:

curl -s https://api.github.com/repos/theAsmodai/metamod-r/releases/latest | jq -r ".assets[-1] | .browser_download_url"
Я не знаю какую подпись сделать, простите...

Всё получилось! Можно смело скачивать нужный нам релиз.

А пока, давайте разберемся, что же делает кусочек кода, что добавился. Он просто вытаскивает информацию из browser_download_url.

Весь этот запрос после -r нужно писать в двойных кавычках, а сами запросы необходимо разделять при помощи |. Иначе магия не получиться.


А теперь, попробуем получить login и type того, кто загрузил данный релиз.

curl -s https://api.github.com/repos/theAsmodai/metamod-r/releases/latest | jq -r ".assets[-1] | .uploader | {login, type}"

Мы всё так же продолжаем получать последний элемент массива assets, дальше переходим в объект uploader, а для фильтрации выбираем поля login и type. В итоге получим следующий ответ:

{
  "login": "theAsmodai",
  "type": "User"
}

А если нам нужен всего лишь логин? Каким образом можно переходить в другие объекты?

curl -s https://api.github.com/repos/theAsmodai/metamod-r/releases/latest | jq -r ".assets[-1] | .uploader.login"

Данная команда выведет логин автора - theAsmodai.

Послесловие

Естественно, все эти вещи можно комбинировать как вам захочется. Я показал лишь базовые функции, их вам должно хватить.

jq довольно многогранен. Обо всех его функциях можно узнать вот в этом мануале.
Отказ от ответственности

Report Page