У меня есть следующий пример строк JSON:
{"toplevel_key": "top value 1", "list": [{"key1": "value 1", "key2": "value 2"},{"key1": "value 3", "key2": "value 4"}]}
{"toplevel_key": "top value 2", "list": [{"key1": "value 5", "key2": "value 6"}]}
Я хочу преобразовать его с помощью JQ, развернув список до фиксированного количества «столбцов», в результате чего получится список плоских объектов JSON в следующем формате:
{
"top-level-key": "top value 1",
"list_0_key1": "value 1",
"list_0_key2": "value 2",
"list_1_key1": "value 3",
"list_1_key2": "value 4",
}
{
"top-level-key": "top value 2",
"list_0_key1": "value 4",
"list_0_key2": "value 5",
"list_1_key1": "",
"list_1_key2": "",
}
Примечание: на самом деле я хочу, чтобы они были по одной на строку, отформатированы здесь для удобочитаемости.
Единственный способ получить желаемый результат — записать все столбцы в моем выражении JQ:
$ cat example.jsonl | jq -c '{toplevel_key, list_0_key1: .list[0].key1, list_0_key2: .list[0].key2, list_1_key1: .list[1].key1, list_1_key2: .list[1].key2}'
Это дает мне результат, который я хочу, но мне приходится вручную писать ВСЕ фиксированные «столбцы» (а в производстве их будет намного больше).
Я знаю, что мог бы использовать скрипт для создания кода JQ, но меня НЕ интересует такое решение — оно не решит мою проблему, потому что оно предназначено для приложения, которое принимает только JQ.
Есть ли способ сделать это в чистом JQ?
Это то, что я смог получить до сих пор:
$ cat example.jsonl | jq -c '(.list | to_entries | map({("list_" + (.key | tostring)): .value})) | add'
{"list_0":{"key1":"value 1","key2":"value 2"},"list_1":{"key1":"value 3","key2":"value 4"}}
{"list_0":{"key1":"value 5","key2":"value 6"}}