Я хотел бы сгладить файл JSON, чтобы удовлетворить потребности устаревшей программы. Я бы предпочел использовать для этого jq, так как знаю, что это мне доступно.
У меня есть файл примерно такого типа:
[
{
"field1":10,
"field2":20,
"msg":
{
"a":1,
"b":2,
"c":3
}
}
]
По причинам мне нужно вытащить поля a и b из msg и сгладить их имена:
[
{
"field1":10,
"field2":20,
"msg.a":1,
"msg.b":2,
"msg": # the entire msg structure is now optional; if it falls off that's ok
{
"a":1,
"b":2,
"c":3
},
}, ...
]
Как совершается чудо?
В этом вопросе есть close. Я просто хочу сказать, что ответ ниже намного лучше, чем ответ в предложенной теме.

Это отлично работает с примером ввода:
map(. + (.msg | {"msg.a": .a, "msg.b": .b}))
Это более гибко, если фактическая задача включает в себя больше ключей или ключей с более длинными именами:
map(. + (.msg | {a, b} | with_entries(.key |= "msg.\(.)")))
А если вы сделаете это для нескольких полей, например msg, функция поможет сократить код:
def f(x): . as $in
| reduce path(x) as $p ({};
. + {($p | join(".")): $in | getpath($p)}
);
map(. + f(.msg | .a, .b))
Вы можете удалить объект msg, используя: map(del(.msg) + (.msg | {a, b} | with_entries(.key |= "msg.\(.)"))) и все поля: map(del(.msg) + (.msg | with_entries(.key |= "msg.\(.)"))) Это работает на jqkungfu.com
Спасибо, это сработает. Но мне нужно кое-что почитать.
Отвечает ли это на ваш вопрос? Сглаживание вложенного JSON с помощью jq