Вопрос или проблема
У меня есть следующий файл 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
.
Шаги для сохранения одного ключа
-
Исходный JSON: Вы начали с JSON-объекта, содержащего несколько аутентификаций для разных регистраторов.
{ "auths": { "reg1.io": { "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }, "reg2.io": { "auth": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" }, "reg3.io": { "auth": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" } } }
-
Использование jq: Чтобы сохранить только
reg2.io
, вы можете использовать следующую команду:jq '.auths |= with_entries(select(.key == "reg2.io"))' config.json
Разбор команды:
auths |= ...
— обновляет объектauths
, применяя к нему результат операции.with_entries(...)
— преобразует объект в массив пар "ключ-значение".select(.key == "reg2.io")
— выбирает только те пары, у которых ключ равен "reg2.io".
-
Параметризация ключа: Если вам нужно динамически задавать ключ, это можно сделать с помощью параметра:
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-данных.