Вопрос или проблема
Команда
curl "https://tools.keycdn.com/geo.json?host={18.205.6.240}"
возвращает следующий JSON-документ:
{"status":"success","description":"Данные успешно получены.","data":{"geo":{"host":"18.205.6.240","ip":"18.205.6.240","rdns":"ec2-18-205-6-240.compute-1.amazonaws.com","asn":14618,"isp":"AMAZON-AES","country_name":"Соединенные Штаты","country_code":"US","region_name":"Вирджиния","region_code":"VA","city":"Ашберн","postal_code":"20149","continent_name":"Северная Америка","continent_code":"NA","latitude":39.0469,"longitude":-77.4903,"metro_code":511,"timezone":"America\/New_York","datetime":"2022-06-17 10:44:39"}}}
В этом выводе мне нужно извлечь country_name
. Я не уверяю, как это сделать.
$ curl -s 'https://tools.keycdn.com/geo.json?host={18.205.6.240}' | jq -r '.data.geo.country_name'
Соединенные Штаты
Выражение jq
.data.geo.country_name
извлекает данный элемент из JSON-документа, возвращаемого с конечной точки, к которой вы получаете доступ с помощью curl
.
Если вы также можете использовать приведённую ниже версию:
Ниже представлен вывод REST API:
{
"error": "none",
"message": "Успех",
"data": {
"name": "Вишал Бирадар",
"userId": 1,
}
}
Ниже представлен код скрипта, который показывает, как мы можем это прочитать.
#!/bin/bash
LOGIN_DATA=$(\
curl -d "[email protected]&password=abcd123" \
http://localhost:1234/login \
| python -c "import sys, json; print json.load(sys.stdin)['data']['name']"\
)
echo "LOGIN_DATA=$LOGIN_DATA"
Ответ или решение
Извлечение данных из JSON-документа, полученного через cURL
В данной статье мы обсудим, как извлечь конкретное значение из JSON-документа, возвращаемого с помощью команды curl
. Рассмотрим пример запроса к API, который предоставляет геоинформацию по IP-адресу, и используя инструмент jq
, мы получим интересующее нас значение – country_name
.
Шаг 1: Использование команды cURL
В начале нам нужно выполнить запрос к API с использованием команды curl
. Предположим, мы хотим узнать страну для IP-адреса 18.205.6.240
. Запрос будет выглядеть следующим образом:
curl "https://tools.keycdn.com/geo.json?host=18.205.6.240"
Этот запрос вернет JSON-документ, который содержит различные поля, включая информацию о местоположении.
Шаг 2: Обработка ответа с помощью jq
Чтобы извлечь country_name
из полученного JSON, рекомендуется использовать утилиту jq
, которая предназначена для обработки JSON-анализов. Команда для извлечения будет следующей:
curl -s "https://tools.keycdn.com/geo.json?host=18.205.6.240" | jq -r '.data.geo.country_name'
- Здесь флаг
-s
используется для того, чтобы отключить вывод прогресс-рейтинга, что позволяет получать только результат. - Выражение
jq -r '.data.geo.country_name'
указывает инструментуjq
, что мы хотим получить значение поляcountry_name
, находящегося в иерархииdata.geo
.
Результат выполнения команды
При выполнении данной команды вы получите следующий вывод:
United States
Это означает, что страна, соответствующая указанному IP-адресу, – Соединенные Штаты.
Пример извлечения данных из другого JSON-документа
Для наглядности рассмотрим еще один пример, когда мы получаем данные из REST API, где JSON выглядит следующим образом:
{
"error": "none",
"message": "Success",
"data": {
"name": "Vishal Biradar",
"userId": 1
}
}
Допустим, мы хотим извлечь имя пользователя name
. В этом случае можно использовать следующий скрипт на Bash:
#!/bin/bash
LOGIN_DATA=$(\
curl -d "email=user@example.com&password=abcd123" \
http://localhost:1234/login \
| python -c "import sys, json; print(json.load(sys.stdin)['data']['name'])"\
)
echo "LOGIN_DATA=$LOGIN_DATA"
В этом примере мы используем Python для обработки JSON и извлечение нужного значения.
Заключение
Извлечение данных из JSON-документа с помощью curl
и jq
– это мощный инструмент для работы с API. Убедитесь, что у вас установлен jq
, чтобы упростить обработку JSON-записей. Если вы хотите автоматизировать любую проверку API или интеграцию, использование этих инструментов могут значительно упростить процесс. Применяя данные подходы, вы сможете возвращать нужные значения из API за минимальное время, что является важным аспектом для разработки высокопроизводительных приложений.