Поиск по сайту:

Как работать с JSON в командной строке


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

Разбор JSON с помощью jq

jq – это утилита, которая может обрабатывать все, что вам нужно сделать с JSON. Его очень просто установить; просто загрузите двоичный файл и переместите его в свою папку в PATH, обычно /usr/local/bin/. У него нет зависимостей, поэтому для загрузки достаточно одного бинарного файла. Также есть загрузки для macOS и Windows.

Для начала вы можете передать ему JSON, чтобы красиво напечатать его. Некоторые API минимизируют свои ответы для экономии места, что приводит к ужасному беспорядку, когда вы закручиваете что-то в консоли:

Передайте его в jq следующим образом:

curl https://api.example.com/ | jq

И теперь это читабельно, с подсветкой синтаксиса для загрузки:

Если вы дадите jq команду, она будет использовать ее для выбора данных из JSON, подобно тому, как sed работает с текстом. Мы будем использовать этот JSONPlaceholder в качестве примера API для опробования команд. Для простоты мы опустим команду curl и конвейер, чтобы все было читабельно. Вы также можете свернуть в файл и передать cat в jq, если вы не хотите видеть вывод curl при каждом тестировании новая команда.

Простая точка ‘.’ представляет данные, переданные в jq. Если вы просто хотите получить ключ от объекта, вы можете сделать:

jq '.status'

Вы также можете вложить это; например, .data.geo.host вернет значение, расположенное ниже по списку. При желании вы можете добавить вопросительный знак для проверки ошибок, например «.data.geo?.host», который указывает, что свойство является необязательным.

Работа с массивами — вот где jq становится интересным. Вы можете использовать квадратные скобки, чтобы получить определенный элемент массива. Например, вы можете получить имя первой записи с помощью:

jq '.[0].name'

Вы можете нарезать массивы, используя [2:5], и использовать тот же синтаксис вопросительного знака для необязательных свойств. Однако имейте в виду, что если массив пуст, это не означает, что это недопустимое свойство.

Однако вы, вероятно, захотите получить конкретную запись на основе данных внутри нее, а не в порядке массива. Для этого передайте весь массив утилите select :

jq '.[] | select(.name | contains("Leanne"))'

Это фильтрует массив, чтобы включать только те элементы, которые проходят тест; в этом случае поле name содержит определенное имя? Это может быть любое логическое выражение, даже арифметическое вроде select(.count >= 2).

Переформатирование JSON

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

cat json | jq '.[0] | {name: .name, company: .company}'

Хорошо выводит в командную строку:

Хотя это полезно для извлечения только необходимой информации, вы также можете создавать новые объекты с помощью команд jq .

Для получения полной информации обо всем синтаксисе jq вы можете обратиться к его онлайн-руководству.

Альтернативы JQ

Если вы не хотите использовать другую программу, вы можете использовать несколько альтернатив. Самый простой способ — отказаться от выполнения этого в bash и вместо этого использовать язык сценариев, такой как Python или JavaScript (с узлом), для фактической обработки. Вместо этого вы должны передать вывод команды JSON в файл:

curl https://api/example.com/ > json.txt

А затем загрузите его в переменную в скрипте для использования.

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

grep "name" | sed 's/"name": "(.*)"/1/'

Однако это может (и, вероятно, будет) очень легко сломаться при любых изменениях в JSON. Передача API пользователей вернула имя каждого пользователя, а также имя пользователя (которое также совпало с grep), а также название компании (у которой был точно такой же ключ). Если вы не планируете учитывать все это, вам следует использовать что-то, что знает о структуре JSON, а не рассматривать его как текст.