Выравнивание файла JSON с помощью JQ

Я хотел бы сгладить файл 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
  },
}, ...
]

Как совершается чудо?

Отвечает ли это на ваш вопрос? Сглаживание вложенного JSON с помощью jq

knittl 17.06.2024 21:16

В этом вопросе есть close. Я просто хочу сказать, что ответ ниже намного лучше, чем ответ в предложенной теме.

Tony Ennis 17.06.2024 21:38
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это отлично работает с примером ввода:

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

Mr. Polywhirl 17.06.2024 21:28

Спасибо, это сработает. Но мне нужно кое-что почитать.

Tony Ennis 17.06.2024 21:34

Другие вопросы по теме