Вопрос или проблема
Я использую несколько ключей из длинного объекта javascript, представленного в формате json. Пример:
...
"stock": {
"type": 'str',
"properties": {
"warehouse": {
"type": 123
},
"retail": {
"type": false
}
}
}
...
Я хотел бы знать полный путь, например, к ключу type
. Что-то вроде get-path type
, чтобы получить root.somethingElse.stock.properties.retail.type
без необходимости делать это вручную. Это длинный файл, и поиск вверх и вниз не кажется продуктивным…
Инструменты CLI или GUI подходят. Однако я не могу найти приложение, расширение или инструмент командной строки, который это возвращает.
Я попробовал “JsonView” для Chrome, но не смог загрузить локальный файл.
jq также не кажется, чтобы решала эту проблему, так как отсутствуют некоторые двойные кавычки.
ИСПРАВЛЕНИЕ: Я осознал, что это был js объект, хотя и представлен в формате json.
Начнем с корректно оформленного и полного MWE :
{
"stock": {
"type": "str",
"properties": {
"warehouse": {
"type": 123
},
"retail": {
"type": false
}
}
}
}
Затем используя jq
(v1.5):
$ jq -M -c 'path(..|.type? // empty) | join(".")' mwe.json
"stock.type"
"stock.properties.warehouse.type"
(добавьте -r
, чтобы избежать кавычек на выходе, -M
и -c
нужны только для форматирования вывода). Это рекурсивно проходит по структуре (..
), ища индекс или ключ “type”, подавляет ошибки (?
), когда это неуместно, и оценивает как “empty” (//
), когда значение является false или null, затем объединяет (join()
) массив путей.
Возможная проблема в том, что значение false
(или null) вызывает empty
(по крайней мере в v1.5, но не в v1.4) и элемент stock.properties.retail.type
пропускается.
Без | join(".")
вы получите массивы JSON, что также может быть полезно:
["stock","type"]
["stock","properties","warehouse","type"]
Более сложная версия, включая значения:
$ jq -M -c '[paths(.|select(type=="object" and has("type")) )][] \
as $path | [$path+["type"], getpath($path + ["type"])]' mwe.json
[["stock","type"],"str"]
[["stock","properties","warehouse","type"],123]
[["stock","properties","retail","type"],false]
Это немного более изящно, создается массив, выбирающий все объекты, которые имеют дочерний “type”, затем печатает путь к “type” и его значение.
Ответ или решение
Как получить пути ключей в длинных JSON файлах в Linux?
В задачах разработки и анализа данных часто возникает необходимость извлечения путей к ключам из сложных структур JSON. В данном руководстве мы рассмотрим, как эффективно получить полные пути к ключам внутри длинных JSON-объектов на операционных системах Linux с помощью командной строки, а также использованием утилиты jq
.
Предпосылки
Для работы с JSON необходимо убедиться, что у вас установлен jq
. Это мощный инструмент для обработки и анализа JSON-файлов из командной строки. Вы можете установить jq
с помощью пакетного менеджера, например:
sudo apt-get install jq
или
sudo yum install jq
Пример JSON-формата
Для примера возьмём следующий JSON-объект:
{
"stock": {
"type": "str",
"properties": {
"warehouse": {
"type": 123
},
"retail": {
"type": false
}
}
}
}
Извлечение путей к ключам
1. Базовый вариант использования
Если необходимо просто извлечь пути к ключу type
, вы можете использовать следующую команду:
jq -M -c 'path(.. | .type? // empty) | join(".")' mwe.json
Пояснение:
..
— рекурсивно обходит весь JSON..type? // empty
— ищет ключtype
, отсутствие которого не вызывает ошибок.path(...)
— возвращает путь к найденному ключу в формате массива.join(".")
— соединяет элементы массива в строку, разделяя их точками.
2. Получение значений вместе с путями
Если вы хотите получить путь и соответствующее значение для каждого найденного ключа type
, используйте более сложный запрос:
jq -M -c '[paths(. | select(type=="object" and has("type")))[] as $path | [$path + ["type"], getpath($path + ["type"])] ]' mwe.json
Пояснение:
select(type=="object" and has("type"))
— выбирает только объекты, которые содержат ключtype
.getpath($path + ["type"])
— извлекает значение по указанному пути.
Это выдаст массив массивов, где каждый подмассив содержит путь и соответствующее значение, например:
[["stock","type"],"str"]
[["stock","properties","warehouse","type"],123]
[["stock","properties","retail","type"],false]
Проблемы и решения
Если вы столкнулись с проблемой, что утилита jq
не распознаёт некоторые ключи, возможно, это связано с версиями или тем, что в JSON отсутствуют кавычки. Убедитесь, что ваш JSON является корректным. Вы можете проверить его с помощью онлайн-валидаторов или использовать jq
для форматирования.
Заключение
Использование jq
для анализа и манипуляции JSON-данными в Linux — это мощный способ ускорить и упростить работу с структурированными данными. Применяя описанные методы, вы сможете быстро находить пути к ключам в больших и сложных JSON-объектах, что значительно повысит эффективность вашего рабочего процесса.
Если у вас есть дополнительные вопросы или вы хотите поделиться своим опытом работы с jq
, не стесняйтесь оставлять комментарии!