[Перевод] Как распарсить JSON-строку в коммандной строке Linux
Если вы часто работаете с текстами формата JSON из командной строки или в шелл-скриптах, вы можете задаться вопросом, есть ли какая-то консольная утилита, которая может распарсить JSON-строку. Консольный JSON-парсер может быть удобен, когда вы тестируете или отлаживаете сетевые JSON-сервисы. Вы можете скормить ответы формата JSON от веб-сервиса консольному JSON-парсеру, тем самым легко изучая трудночитаемые JSON-ответы или извлекая из них отдельные объекты.
В этом руководстве я покажу как распарсить JSON-строку из командной строки.
В Linux есть консольный JSON-процессор jq, который делает то, что нам необходимо. Используя jq, вы можете парсить, фильтровать, мапить и преобразовывать JSON-структуру данных без особых усилий.
Для установки jq на Linux, просто скачайте его бинарник (доступен отдельно для 32- и 64-битной систем) как показано далее.
$ wget http://stedolan.github.io/jq/download/linux32/jq # (32-битная система)
$ wget http://stedolan.github.io/jq/download/linux64/jq # (64-битная система)
$ chmod +x ./jq
$ sudo mv jq /usr/local/bin
Бинарник jq также доступен для Windows, OS X и Solaris платформ, а его полный исходный код выпущен под лицензией MIT.
Также вы можете установить jq из репозитория вашего дистрибутива Linux.
Для Debian и Ubuntu:
$ sudo apt-get install jq
Для Fedora:
$ sudo dnf install jq
Для openSUSE:
$ sudo zypper install jq
Следующие примеры показывают как парсить JSON-структуру данных с помощью jq.
Пример JSON-схемы:
$ cat json.txt
{
"name": "Google",
"location":
{
"street": "1600 Amphitheatre Parkway",
"city": "Mountain View",
"state": "California",
"country": "US"
},
"employees":
[
{
"name": "Michael",
"division": "Engineering"
},
{
"name": "Laura",
"division": "HR"
},
{
"name": "Elise",
"division": "Marketing"
}
]
}
Чтобы распарсить JSON-объект:
$ cat json.txt | jq '.name'
"Google"
Чтобы распарсить вложенный JSON-объект:
$ cat json.txt | jq '.location.city'
"Mountain View"
Чтобы распарсить JSON-массив:
$ cat json.txt | jq '.employees[0].name'
"Michael"
Чтобы извлечь конкретные поля из JSON-объекта:
$ cat json.txt | jq '.location | {street, city}'
{
"city": "Mountain View",
"street": "1600 Amphitheatre Parkway"
}