入れ子になった配列コンテンツで文書を作成する

入れ子になった配列コンテンツで文書を作成する

次の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最上位配列の項目が配列の場合、項目はコピーされます(上記と同じ意味)。それ以外の場合はそのまま残ります。

おすすめ記事