Утилиты для обработки JSON
Независимо от того, взаимодействуете ли вы с API или делаете запрос в базу данных, вы, вероятно, получите данные в формате JSON. Большинство популярных языков программирования имеют встроенные возможности для обработки и анализа JSON. Однако не всё так просто, если вы работаете с данными в Bash.
По умолчанию оболочки, такие как Bash, не имеют стандартного парсера JSON. Необходимо либо использовать интерпретатор языка программирования, либо установить соответствующую утилиту. Если вы хотите ограничиться возможностями командной строки, то установка утилиты, вероятно, будет самым простым вариантом. Вам не придется настраивать интерпретатор и устанавливать дополнительные зависимости.
Большинство специализированных утилит для работы с JSON также работают очень быстро, занимают мало места и не нуждаются в каких-либо дополнительных зависимостях.
В этой статье мы рассмотрим некоторые популярные утилиты, которые добавляют эту важную функцию в вашу оболочку командной строки. Это также позволит обрабатывать данные JSON в скриптах.
jq
https://stedolan.github.io/jq/
Без сомнения, это одна из самых популярных утилит для работы с JSON, которая в основном используется для фильтрации и обработки входящих данных JSON. Особенно она полезна, если вы работаете со скриптами, которые взаимодействуют с API. Утилита небольшая и очень быстрая.
Запрос к API без использования jq
вернёт необработанные данные в формате JSON:
$ curl --silent https://randomuser.me/api
{"results":[{"gender":"female","name":{"title":"Mrs","first":"Alice","last":
"Williams"},"location":{"street":{"number":3138,"name":"Parliament St"},"city":
"Elgin","state":"Newfoundland and Labrador","country":"Canada","postcode":
"E3P 6W1","coordinates":{"latitude":"-64.8528","longitude":"132.5197"},"timezone":
{"offset":"-12:00","description":"Eniwetok, Kwajalein"}},"email":
"alice.williams@example.com","login":{"uuid":"0fa05a45-68c5-458e-8949-a902909c0366","username":
"organicmouse652","password":"desert","salt":"FWwxI4cL","md5":
"2ac513eba7e262d9a4a337f7612f1ccd","sha1":"3be657547a30a48baa880157870c611471fa5f64","sha256":
"b9624ef417a792266c38901d7d60b3333ea0b500bd92765e3a231b5ad72f6559"},"dob":
{"date":"1947-01-20T09:49:10.987Z","age":74},"registered":{"date":"2004-09-26T02:
43:22.681Z","age":17},"phone":"057-014-3165","cell":"950-360-9030","id":{"name":
"","value":null},"picture":{"large":"https://randomuser.me/api/portraits/women/59.jpg","medium":
"https://randomuser.me/api/portraits/med/women/59.jpg","thumbnail":
"https://randomuser.me/api/portraits/thumb/women/59.jpg"},"nat":"CA"}],"info":
{"seed":"a86aaf53eb0eae8c","results":1,"page":1,"version":"1.3"}}
Когда вы передаете вывод в jq
, то можете начать сразу выполнять к нему простые запросы. Если вы просто перенаправите вывод в jq
, он выведет его в консоль в формате, удобном для чтения.
Предположим, что все, что нам нужно, — это случайное имя из API. Этот фильтр возвращает нам первый элемент массива, а затем получает из него ключ name
. Результат будет примерно следующий:
$ curl --silent https://randomuser.me/api | jq '.results[0] .name'
{
"title": "Miss",
"first": "Charline",
"last": "Legrand"
}
Теперь у нас есть простой инструмент командной строки для работы с JSON, вы также можете использовать его в скриптах.
Однако функциональность jq
не ограничивается простыми фильтрами. Допустим, мы хотим создать совершенно новый ключ с именем fullname
, который будет содержать одновременно имя и фамилию. С jq
это сделать совсем несложно:
$ curl --silent https://randomuser.me/api | \
jq '.results[0] | {fullname: (.name.first + " " + .name.last)}'
{
"fullname": "Charline Legrand"
}
Вы можете объединять jq-фильтры вместе так же, как вы объединяете команды в оболочке.
Список возможностей jq
достаточно велик. Ознакомьтесь с руководством, чтобы узнать, как выжать максимум из этой замечательной утилиты.
jo
В то время как jq
отлично подходит для анализа и обработки существующих данных JSON, jo
лучше подходит для создания данных в формате JSON. Эта удобная небольшая утилита позволяет нам создавать структуры данных JSON намного проще, чем вручную:
$ jo name=bob creation_date="$(date +%m-%d-%y)"
{"name":"bob","creation_date":"02-23-21"}
Вместо того, чтобы создавать строку вручную и обрабатывать каждую фигурную скобку и кавычки, мы просто объявляем каждый элемент как обычную переменную.
Мы также можем печатать большие блоки данных, используя параметр -p
с jo
. Давайте посмотрим, как это будет выглядеть, когда мы создадим массив данных:
$ jo -p arr=$(jo -a one two three four five six)
{
"arr": [
"one",
"two",
"three",
"four",
"five",
"six"
]
}
Подробнее о работе с jo
и о некоторых из ее действительно интересных возможностях, читайте в статье:
https://jpmens.net/2016/03/05/a-shell-command-to-create-json-jo/
json_pp
https://github.com/deftek/json_pp
Это простая утилита, которая позволяет отображать объекты JSON в более удобном формате, а также конвертировать их между разными форматами. Утилита json_pp
аккуратно отформатирует JSON с правильным интервалом и отступом, чтобы вы могли быстрее находить нужную информацию:
$ curl --silent https://randomuser.me/api | json_pp
{
"info" : {
"page" : 1,
"results" : 1,
"seed" : "83b8f82090d14bfb",
"version" : "1.3"
},
"results" : [
{
"cell" : "076 515 26 35",
"dob" : {
"age" : 28,
"date" : "1993-03-05T14:37:55.246Z"
},
"email" : "annelise.durand@example.com",
...
У этой утилиты отсутствует такой широкий набор возможностей, как у jq
или jo
, но она позволяет легко получить удобный для чтения JSON.
jshon
Еще один чрезвычайно удобный парсер JSON — это jshon
. Эта программа имеет функциональность, аналогичную jq
, и существует уже довольно давно. Есть фильтры, похожие на jq
, а также удобные встроенные функции. Некоторые из основных функций отлично подходят для быстрого анализа больших объемов данных. Давайте посмотрим, как мы получим все ключевые имена из объекта:
$ echo '{"key1":"value1","key2":"value2","key3":"value3"}' | jshon -k
key1
key2
key3
Кроме того, вы можете получить ключи с помощью jq
, но результатом будет фактический объект массива, например:
$ echo '{"key1":"value1","key2":"value2","key3":"value3"}' | jq keys
[
"key1",
"key2",
"key3"
]
Если вам нужен необработанный ключ, вы можете просто использовать jshon
. Вдобавок к этому, jshon
очень быстрый, он работает более чем в 7 раз быстрее jq
::
$ time echo '{"key1":"value1","key2":"value2","key3":"value3"}' | jshon -k
key1
key2
key3
real 0m0.005s
user 0m0.002s
sys 0m0.004s
$ time echo '{"key1":"value1","key2":"value2","key3":"value3"}' | jq keys
[
"key1",
"key2",
"key3"
]
real 0m0.039s
user 0m0.035s
sys 0m0.005s