У меня есть некоторый json, описывающий состояния плагина, который читается как
{
"mods": [
{
"name": "somename",
"enabled": true
},
{
"name": "someothername",
"enabled": false
}
]
}
и я пытаюсь удалить шаблон из него для презентации и редактирования человеком, а затем снова вставить шаблон. У меня есть гуманизирующее преобразование, приятно компактное и разумное:
jq '[ .mods[]|{(.name): .enabled} ] | add' mod-list.json
{
"somename": true,
"someothername": false
}
но я застрял на другом пути: я хочу преобразовать вывод выше обратно в его ввод.
Я посмотрел на keys_unsorted,.[]
, но я не вижу, как соединить последовательности вместе, и в руководстве есть тревожные комментарии о том, что ключи находятся «примерно в порядке вставки», что заставляет меня тосковать по какой-то более явной гарантии того, что последовательности ключей и значений из этого конструкция будет по крайней мере в том же порядке, если не в исходном.
Я также пробовал foreach и reduce, и они мучительно близки, но (а) они объединяют ключи в массив, и (б) я не вижу, как получить соответствующие значения:
jq 'foreach keys as $key ({};{name:$key, enabled:false}'
Так вот где я застрял.
Использование to_entries
может быть одним из способов:
{mods: to_entries | map({name: .key, enabled: .value})}
Использование keys
или keys_unsorted
может быть другим:
{mods: [keys_unsorted[] as $name | {$name, enabled: .[$name]}]}
Выход:
{
"mods": [
{
"name": "somename",
"enabled": true
},
{
"name": "someothername",
"enabled": false
}
]
}
Спасибо! Вот оно. Я использовал jq '{mods:[to_entries[]|{name:.key,enabled:.value}]}'
Ваш вопрос не очень ясен. Не могли бы вы привести пример входного JSON, желаемого промежуточного JSON (который отсутствует в вопросе) и конечного результата?