次のJSONが与えられた場合:
[
{
"command": "1",
"response": [
"a",
"b",
"c"
],
"guild_id": "guild"
},
{
"command": "1",
"response": "d",
"guild_id": "guild"
},
]
を使用して、次のように変換できますかjq
?
[
{
"command": "1",
"response": "a",
"guild_id": "guild"
},
{
"command": "1",
"response": "b",
"guild_id": "guild"
},
{
"command": "1",
"response": "c",
"guild_id": "guild"
},
{
"command": "1",
"response": "d",
"guild_id": "guild"
},
]
答え1
jq 'map(if (.response|type == "array") then .response = .response[] else . end)' file
response
これは、最上位配列の各要素の項目タイプをテストします。配列の場合、項目は「爆発」するか、各配列要素に対して1回繰り返されます。それ以外の場合はそのまま残ります。
質問のデータに基づいた結果(問題のあるカンマが削除されました):
[
{
"command": "1",
"response": "a",
"guild_id": "guild"
},
{
"command": "1",
"response": "b",
"guild_id": "guild"
},
{
"command": "1",
"response": "c",
"guild_id": "guild"
},
{
"command": "1",
"response": "d",
"guild_id": "guild"
}
]
同じですが、もう少し神秘的です。
jq 'map(.response = .response[]? // .)' file
response
最上位配列の項目が配列の場合、項目はコピーされます(上記と同じ意味)。それ以外の場合はそのまま残ります。