created: 2019-11-24T00:18:24.000Z

jqで変形 (オブジェクト => 配列 => オブジェクト)

こんなデータ構造のjsonがあるとして

{
  "APP1": { "name": "旧App", "monId": 277013 },
  "APP2": { "name": "App", "monId": 241736 },
  "DB": { "name": "Database", "monId": 234737 },
  "S": { "name": "Static", "monId": 221738 }
}

この形式にjqで変換したい

{
  "277013": "旧App",
  "241736": "App",
  "234737": "Database",
  "221738": "Static"
}

具体的には

こんなオブジェクトに変換したい

  • monId をオブジェクトのキーに
  • 値は name

jqで変換

スクリプトはこんな感じ

pbpaste | jq '. 
  | to_entries 
  | map({ (.value.monId|tostring): (.value.name) }) 
  | add '
  • オブジェクトから to_entries でいっかい配列に
  • 配列の各要素からキーとバリューをのセットを取得
  • map | add で再度オブジェクトに変換

to_entries

オブジェクトから配列に変換してくれる

この形を

{
  "APP1": { "name": "旧App", "monId": 277013 },
  "APP2": { "name": "App", "monId": 241736 }
}

こうしてくれる

$ pbpaste | jq '. | to_entries'
[
  {
    "key": "APP1",
    "value": {
      "name": "旧App",
      "monId": 277013
    }
  },
  {
    "key": "APP2",
    "value": {
      "name": "App",
      "monId": 241736
    }
  }
]

map({ (.value.monId|tostring): (.value.name) }) | add

  • オブジェクトのキーはstringな必要があるため .value.monId|tostring
  • map | add は配列からオブジェクトへ変換するときに使う
    • 2つのオブジェクトをaddすると、オブジェクトのマージになる

add の例

[
  {"a": 1},
  {"b": 2}
]
$ pbpaste | jq '. | add'
{
  "a": 1,
  "b": 2
}
ダークナイト [Blu-ray]
[ad] ダークナイト [Blu-ray]
出演 クリスチャン・ベール, マイケル・ケイン (Blu-ray)