Как получить путь к ключу JavaScript в длинных JSON-файлах в Linux

Вопрос или проблема

Я использую несколько ключей из длинного объекта 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, не стесняйтесь оставлять комментарии!

Оцените материал
Добавить комментарий

Капча загружается...