Вопрос или проблема
У меня есть такой json файл:
"[{\"id\":188457,\"title\":\"Кружка для чая с крышкой «Росписный Дракон»\",\"slug\":\"painted-dragon-tea-mug-with-lid\",\"image\":\"https:\\\/\\\/thievemedia.imgix.net\\\/2018\\\/09\\\/painted-dragon-tea-mug-with-lid-featured-1.jpg\",\"full_image_url\":\"https:\\\/\\\/s3.amazonaws.com\\\/thieve-media\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/painted-dragon-tea-mug-with-lid-featured-1.jpg\",\"large_image_url\":\"https:\\\/\\\/s3.amazonaws.com\\\/thieve-media\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/painted-dragon-tea-mug-with-lid-featured-1.jpg\",\"medium_image_url\":\"https:\\\/\\\/s3.amazonaws.com\\\/thieve-media\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/painted-dragon-tea-mug-with-lid-featured-1.jpg\",\"original_price\":\"19.78\",\"price\":\"13.65\",\"discount\":\"30.99\",\"rating\":\"4.7\",\"total_orders\":\"10\",\"promotion_url\":\"https:\\\/\\\/api.thieve.co\\\/view?id=MzI4NTk0Njg0MDE=\",\"product_like_count\":\"100\",\"product_user_likes\"}]
Как я могу извлечь только названия с помощью jq?
Запрос '.[] | {title}'
даст вам только элементы заголовков (но имейте в виду, что ваш пример документа, похоже, имеет ошибки), предполагая, что ваш документ находится в файле с именем data.json
:
$ jq '.[] | {title}' data.json
{
"title": "Кружка для чая с крышкой «Росписный Дракон»"
}
Первая часть запроса, '.[]'
, возвращает каждый объект из массива верхнего уровня, и они затем передаются во вторую часть, используя оператор |
. Вторая часть запроса, {title}
, просто извлекает элемент “title” из объекта.
Если вы хотите только заголовок как строку, без обертывания результатов в JSON объект, используйте это вместо:
$ jq '.[] | .["title"]' data.json
"Кружка для чая с крышкой «Росписный Дракон»"
Учебник jq
предлагает хороший обзор языка запросов.
Предполагая, что входные данные – это JSON строка, кодирующая фактический JSON документ, вы можете использовать jq
для декодирования строки в JSON, а затем извлечь значение ключа title
из каждого из элементов верхнего уровня массива:
jq -r 'fromjson[].title' file
.
Ответ или решение
Чтобы извлечь только заголовки из вашего JSON-файла с помощью команды jq
, важно правильно обработать данные, так как они представлены в виде закодированного JSON. Давайте подробно рассмотрим процесс и необходимые команды.
Проблема и подготовка
Исходные данные: Вы предоставили строку, содержащую закодированный JSON, которая описывает продукт и включает его title
, id
и другие атрибуты.
"[{\"id\":188457,\"title\":\"Painted Dragon Tea Mug with Lid\",\"slug\":\"painted-dragon-tea-mug-with-lid\"...}]"
Обратите внимание, что изначально это не стандартный JSON, а строка. Поэтому первым шагом будет декодирование этой строки в JSON-формат.
Использование команды jq
Чтобы извлечь только заголовки, вам необходимо использовать следующую команду jq
:
jq -r 'fromjson | .[].title' файл.json
Объяснение команды
-
jq
: это утилита для обработки JSON. -
-r
: флаг, который указываетjq
выводить необработанный текст (без кавычек), что удобно, если вам нужны чистые строки. -
fromjson
: данная функция используется для декодирования строки JSON в валидный JSON-объект. Это особенно важно в вашем случае, так как ваши данные изначально представлены в виде строки JSON. -
|
: оператор передачи, который позволяет передавать результаты одной команды в другую. -
.[].title
: здесь.
указывает на корень JSON-объекта, а[]
извлекает каждый элемент массива, а затем.title
выбирает значение ключаtitle
, связанное с каждым объектом.
Пример
Если ваш JSON-файл назван data.json
, вы можете использовать следующую команду в терминале:
echo "[{\"id\":188457,\"title\":\"Painted Dragon Tea Mug with Lid\",\"slug\":\"painted-dragon-tea-mug-with-lid\"}]" | jq -r 'fromjson | .[].title'
Вывод
После выполнения команды вы получите:
Painted Dragon Tea Mug with Lid
Таким образом, с помощью команды jq
вы эффективно извлекаете заголовки из вашего JSON-документа, даже если данные представлены в виде закодированной строки. Это демонстрирует мощность и гибкость jq
для работы с JSON в различных форматах.