我有以下的JSON行例如:如何使用JQ將對象列表展開爲非規格化對象?
{"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"}}
哇,夥計,你剛把我弄走了! :) 我偶然發現了這個路徑函數,並認爲它可以幫助,但看不到如何適合這些塊。 很高興知道那個'//'操作符,有用的東西! 謝謝! – elias
那些路徑......只是習慣使用它們而已。好的。我必須將它們用於我的曲目。 –