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

Разбор и красивая печать JSON с использованием Jq в Linux

Разобрать и красиво распечатать JSON

JSON — это легкий и независимый от языка формат хранения данных, который легко интегрируется с большинством языков программирования, а также понятен людям, конечно, при правильном форматировании. Слово JSON означает JavaSscript Object Notation, хотя оно начинается с JavaScript и в первую очередь используется для обмена данными между сервером и браузером, но теперь используется во многих областях, включая встроенные системы. Здесь мы собираемся разобрать и красиво распечатать JSON с помощью инструментов командной строки в Linux. Это чрезвычайно полезно для обработки больших данных JSON в сценариях оболочки или для управления данными JSON в сценариях оболочки.

Что такое красивая печать?

Данные JSON структурированы так, чтобы их было легче читать человеку. Однако в большинстве случаев данные JSON хранятся в одной строке, даже без символа окончания строки.

Очевидно, что это не очень удобно для чтения и редактирования вручную.

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

Разбор и красивая печать JSON с использованием jq в Linux

Данные JSON можно анализировать с помощью текстовых процессоров командной строки, таких как awk, sed и gerp. На самом деле JSON.awk — это awk-скрипт, позволяющий сделать это. Однако есть несколько специальных инструментов для той же цели.

  1. jq или jshon, анализатор JSON для оболочки, оба они весьма полезны.
  2. Скрипты оболочки, такие как JSON.sh или jsonv.sh, для анализа JSON в оболочках bash, zsh или Dash.
  3. JSON.awk, awk-скрипт синтаксического анализатора JSON.
  4. Модули Python, такие как json.tool.
  5. underscore-cli, на основе Node.js и JavaScript.

В этом уроке я концентрируюсь только на jq — довольно мощном анализаторе JSON для оболочек с расширенными возможностями фильтрации и написания сценариев.

JSON Красивая печать

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

Пример. Данные с сайта jsonip.com. Чтобы получить внешний IP-адрес в формате JSON, используйте curl или wget. инструменты, как показано ниже.

wget -cq http://jsonip.com/ -O -

Реальные данные выглядят так:

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

Теперь распечатайте это с помощью jq:

wget -cq http://jsonip.com/ -O - | jq '.'

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

{

   "ip": "111.222.333.444",

   "about": "/about",

   "Pro!": "http://getjsonip.com"

}

То же самое можно сделать с помощью модуля Python json.tool. Вот пример:

cat anything.json | python -m json.tool

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

Однако у модуля Python json.tool есть явное преимущество: он кроссплатформенный. Таким образом, вы можете легко использовать его в Windows, Linux или Mac OS.

Рекомендуем прочитать:

  • Предварительная типизация: сделайте вывод команды Ping более красивым и удобным для чтения

Как разобрать JSON с помощью jq

Во-первых, вам нужно установить jq, он уже поддерживается большинством дистрибутивов GNU/Linux, установите его с помощью соответствующих команд установщика пакетов.

В Арч Линукс:

sudo pacman -S jq

В Debian, Ubuntu, Linux Mint:

sudo apt-get install jq

В Федоре:

sudo dnf install jq

В openSUSE:

sudo zypper install jq

Для других ОС или платформ см. официальные инструкции по установке.

Основные фильтры и идентификаторы jq

jq мог читать данные JSON либо из stdin, либо из файла. Вы должны использовать оба в зависимости от ситуации.

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

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

Двойные кавычки. Любой специальный символ, например @, #, $, необходимо заключить в две двойные кавычки. как в этом примере, jq .foo."@bar"

Печать необработанных данных. По какой-либо причине, если вам нужны только окончательные проанализированные данные, не заключенные в двойные кавычки, используйте флаг -r с командой jq, как показано ниже. - jq -r .foo.bar.

Анализ конкретных данных

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

Пример данных JSON из Википедии:

{

  "firstName": "John",

  "lastName": "Smith",

  "age": 25,

  "address": {

    "streetAddress": "21 2nd Street",

    "city": "New York",

    "state": "NY",

    "postalCode": "10021"

},

  "phoneNumber": [

{

  "type": "home",

  "number": "212 555-1234"

},

{

  "type": "fax",

  "number": "646 555-4567"

}

],

  "gender": {

  "type": "male"

  }

}

Я собираюсь использовать эти данные JSON в качестве примера в этом руководстве и сохранить их как sample.json.

Допустим, я хочу отфильтровать адрес из файла sample.json. Итак, команда должна выглядеть так:

jq .address sample.json

Пример вывода:

{

  "streetAddress": "21 2nd Street",

  "city": "New York",

  "state": "NY",

  "postalCode": "10021"

}

Опять же, предположим, что мне нужен почтовый индекс, тогда мне нужно добавить еще один индекс идентификатора объекта, то есть еще один фильтр.

cat sample.json | jq .address.postalCode

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

Анализ элементов массива JSON

Элементы массива JSON заключены в квадратные скобки, что, несомненно, весьма универсально в использовании.

Чтобы проанализировать элементы массива, вам необходимо использовать []идентификатор вместе с другим индексом идентификатора объекта.

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

jq .phoneNumber[] sample.json

Допустим, вам просто нужен первый элемент массива, затем используйте номера объектов массива, начиная с 0, для первого элемента используйте [0], для следующих элементов он должен быть увеличен на единицу. каждый шаг.

jq .phoneNumber[0] sample.json

Примеры сценариев

Допустим, мне нужен только номер дома, а не все данные массива JSON. Вот тут-то и пригодится создание сценариев внутри команды jq.

cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'

Здесь сначала я передаю результаты одного фильтра другому, затем использую атрибут select для выбора определенного типа данных и снова передаю результат другому фильтру.

Объяснение каждого типа фильтров и сценариев jq выходит за рамки и цели этого руководства. Настоятельно рекомендуется прочитать руководство JQ для лучшего понимания, приведенное ниже.

Ресурсы:

  • https://stedolan.github.io/jq/manual/
  • http://www.compciv.org/recipes/cli/jq-for-parsing-json/
  • https://lzone.de/cheat-sheet/jq

Связанное чтение:

  • Как анализировать файлы CSV в сценариях Bash в Linux
  • Учебное пособие по YAML | Начало работы с YAML

Об авторе:

Арнаб Сатапати — заядлый энтузиаст Linux и открытого исходного кода. Он также любит возиться с технологиями и электроникой и делиться своим опытом в Интернете.

Статьи по данной тематике