Как сохранить один конкретный ключ из вложенного объекта json?

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

У меня есть следующий файл config.json:

{
        "auths": {
                "reg1.io": {
                        "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                },
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                },
                "reg3.io": {
                        "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
                }
        }
}

Я хочу оставить только объект reg2.io, чтобы получить:

{
        "auths": {
                "reg2.io": {
                        "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                }
        }
}

Я могу удалить один конкретный объект, например:

→ jq 'del(.. | ."reg2.io"? )' ./config.json
{
  "auths": {
    "reg1.io": {
      "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "reg3.io": {
      "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
    }
  }
}

Но что если я хочу сохранить один конкретный объект? Спасибо.

Используя select() с with_entries(), чтобы выбрать только нужный ключ:

$ jq '.auths |= with_entries(select(.key == "reg2.io"))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

Параметризовано так, чтобы оно принимало нужный ключ из командной строки:

$ jq --arg key "reg2.io" '.auths |= with_entries(select(.key == $key))' file
{
  "auths": {
    "reg2.io": {
      "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
    }
  }
}

Измените == на !=, чтобы удалить указанный ключ.

Обратите внимание, что ваша собственная попытка не различает, где найден ключ в документе, что может вызвать путаницу в общем случае.


Просто чтобы добавить немного больше объяснений о том, что происходит в выражении jq.

В команде with_entries(), виден следующий набор объектов, каждый из которых содержит ключ key и ключ value:

{
   "key": "reg1.io",
   "value": { "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
}
{
   "key": "reg2.io",
   "value": { "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" }
}
{
   "key": "reg3.io",
   "value": { "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" }
}

Вызов select() извлекает каждый объект, для которого данный тест равен true, и отбрасывает остальные. Наш тест просто “Является ли значение ключа key строкой reg2.io?”.

Вызов with_entries(expr) эквивалентен to_entries | map(expr) | from_entries.

Вы можете сохранить одну (или несколько) записи в объекте, используя синтаксис {"reg2.io"}. (Двойные кавычки не нужны, если ваш ключ – это просто слово.) С помощью оператора |= вы можете заменить оригинальный объект на созданный.

jq '.auths|={"reg2.io"}' config.json

Если у вас есть несколько ключей на верхнем уровне и вы хотите оставить только один, вы можете совместить это с еще одним похожим фильтром, с любой стороны:

jq '{auths}|.auths|={"reg2.io"}' config.json

jq '.auths|={"reg2.io"}|{auths}' config.json

Ответ или решение

Чтобы сохранить только один конкретный ключ из вложенного объекта JSON, вы можете использовать утилиту jq, которая является мощным инструментом для работы с JSON данными. Рассмотрим на практике, как можно добиться необходимого результата, опираясь на ваш пример конфигурационного файла config.json.

Шаги для сохранения одного ключа

  1. Исходный JSON: Вы начали с JSON-объекта, содержащего несколько аутентификаций для разных регистраторов.

    {
       "auths": {
           "reg1.io": {
               "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
           },
           "reg2.io": {
               "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
           },
           "reg3.io": {
               "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
           }
       }
    }
  2. Использование jq: Чтобы сохранить только reg2.io, вы можете использовать следующую команду:

    jq '.auths |= with_entries(select(.key == "reg2.io"))' config.json

    Разбор команды:

    • auths |= ... — обновляет объект auths, применяя к нему результат операции.
    • with_entries(...) — преобразует объект в массив пар "ключ-значение".
    • select(.key == "reg2.io") — выбирает только те пары, у которых ключ равен "reg2.io".
  3. Параметризация ключа: Если вам нужно динамически задавать ключ, это можно сделать с помощью параметра:

    jq --arg key "reg2.io" '.auths |= with_entries(select(.key == $key))' config.json

    Это позволяет вашему скрипту быть более универсальным и адаптируемым к разным ситуациям, когда вы хотите сохранить разные ключи.

Зачем использовать jq?

Конечно, использование jq имеет множество преимуществ:

  • Простота: Его синтаксис интуитивно понятен, что позволяет быстро развивать скрипты и манипулировать JSON.
  • Гибкость: Возможность фильтрации, преобразования и агрегации данных.
  • Производительность: Высокая скорость обработки больших объемов данных JSON.

Заключение

Используя jq, вы можете быстро и эффективно сохранять определенные ключи из вложенных объектов JSON, что существенно упрощает обработку данных в вашей рабочей среде. Понимание основ работы с jq не только повысит вашу продуктивность, но и позволит более эффективно управлять конфигурационными файлами и данными, с которыми вы работаете.

SEO Оптимизация

Если вам нужно улучшить SEO вашего контента, обеспечьте исчерпывающее использование термина "работа с JSON", "инструмент jq", а также другие сопроводительные фразы. Например, "как сохранить данные из JSON", "примеры использования jq", и "фильтрация JSON с jq".

Таким образом, вы создаете ценное руководство, которое будет полезно не только вам, но и другим специалистам, интересующимся обработкой JSON-данных.

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

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