jqコマンドでJSONの成形

2023年1月1日

元のJSONファイル

以下のJSONをサンプルデータとして使います。

{
    "total": 4,
    "date": "2022-12-01T00:00:00+09",
    "items": [
        {
            "id": 1,
            "name": "item1",
            "price": 100
        },
        {
            "id": 2,
            "name": "item2",
            "price": 101
        },
        {
            "id": 3,
            "name": "item3",
            "price": 103
        },
        {
            "id": 4,
            "name": "item4",
            "price": 104
        }
    ]
}

特定の要素を取り出す

totalキーの値を取り出します。

$ cat item.json | jq '.total'
10

$ cat item.json | jq  '.date'
"2022-12-01T00:00:00+09"

-rオプションでダブルクォーテーションを削除できます。

$ cat item.json | jq -r '.date'
2022-12-01T00:00:00+09

JSONの配列から一部の要素を取り出して配列を作る

map関数を使って、items要素から特定要素のみを持つJSONの配列を作ります。

$ cat item.json | jq -r '.items | map({id: .id,  name: .name})'
[
  {
    "id": 1,
    "name": "item1"
  },
  {
    "id": 2,
    "name": "item2"
  },
  {
    "id": 3,
    "name": "item3"
  },
  {
    "id": 4,
    "name": "item4"
  }
]

JSONからCSVを作る

上記結果からの配列内の要素のみ取り出します。

$ cat item.json | jq -r '.items | map({id: .id,  name: .name}) | .[] | [.id, .name]'
[
  1,
  "item1"
]
[
  2,
  "item2"
]
[
  3,
  "item3"
]
[
  4,
  "item4"
]

@csvに渡してCSVに変換します。

cat item.json | jq -r '.items | map({id: .id,  name: .name}) | .[] | [.id, .name] | @csv'
1,"item1"
2,"item2"
3,"item3"
4,"item4"

Linux

Posted by fanfanta