コンテンツにスキップ

JSONクエリ@JSON

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. jq

セットアップ

▼ brewリポジトリから

$ brew install jq


02. オプション

例で使用するJSON

以降で使用するJSON型データを以下の通りとする。

# data.json
{"foo": "FOO", "bar": "BAR", "baz": [{"qux": "QUX"}, {"quux": "QUUX"}]}
# list.jsonファイル
# 配列内のオブジェクトごとに、fooキーの値が異なる。
[
  {"foo": "FOO", "bar": "BAR", "baz": "BAZ"},
  {"foo": "BAR", "bar": "BAZ", "baz": "FOO"},
  {"foo": "BAZ", "bar": "FOO", "baz": "BAR"},
]


ファイル読み込み

標準入力に入力することにより、JSONファイルを読み込む。

$ cat data.json | jq '.foo[]'


-r

出力結果のダブルクオーテーションを削除する。

$ cat data.json | jq -r '.foo[]'

FOO
BAR
BAZ


-s

JSON型データのリストから複数のオブジェクトを取得する場合、取得したオブジェクトを再びリストに入れる。

$ cat data.json | jq '.baz[]' | jq -s

[
  {
    "qux": "QUX"
  },
  {
    "quux": "QUUX"
  }
]


03. フィルタリング

パス指定によるフィルタリング

. (ドット)

パスの起点を表す。

$ cat data.json | jq '.'

{
  "foo": "FOO",
  "bar": "BAR",
  "baz": [
    {
      "qux": "QUX"
    },
    {
      "quux": "QUUX"
    }
  ]
}

[]

リストへのパスを表す。もしJSON型データが起点からリストだった場合は、『.[]』になる。

オブジェクトを取得できるだけなため、取得したオブジェクトを再びリストに入れたい場合は、加えて-sオプションを有効化したjqコマンドに渡す必要がある。

$ cat data.json | jq '.baz[]'

{
  "qux": "QUX"
}
{
  "quux": "QUUX"
}
$ cat data.json | jq '.baz[0]'

{
  "qux": "QUX"
}
$ cat list.json | jq '.[]'

{
  "foo": "FOO",
  "bar": "BAR",
  "baz": "BAZ"
}
{
  "foo": "BAR",
  "bar": "BAZ",
  "baz": "FOO"
}
{
  "foo": "BAZ",
  "bar": "FOO",
  "baz": "BAR"
}

▼ 変数

パスに変数を出力する場合は、変数を『''"$VAR"''』のようにダブルクオーテーションとシングルクオーテーションで囲う。

$ KEY_NAME=baz

$ cat data.json | jq '.'"$KEY_NAME"'[]'

{
  "qux": "QUX"
}
{
  "quux": "QUUX"
}


関数によるフィルタリング

▼ select

パスによる取得結果の中から、特定のキーや値を持つオブジェクトを取得する。

# fooキーを持ち、値がFOOやBAZであるオブジェクトを取得する。
$ cat list.json | jq '.[] | select (.foo == "FOO" or .foo == "BAZ")' | jq -s '.'

# 合致するオブジェクトのみを取得できる。
[
  {
    "foo": "FOO",
    "bar": "BAR",
    "baz": "BAZ"
  },
  {
    "foo": "BAZ",
    "bar": "FOO",
    "baz": "BAR"
  },
]


04. 結合

join

jqコマンドの実行結果を任意の文字で結合する。

リストを扱う場合には、パスを『[]』で囲う必要がある。

$ cat list.json | jq '[.[].foo] | join(" ")'

FOO BAR BAZ


05. 変換

text

text形式に変換する。

$ cat list.json | jq '. | @text'


tsv

tsv形式 (タブ切り) に変換する。

$ cat list.json | jq '. | @tsv'


csv

csv形式 (カンマ切り) に変換する。

$ cat list.json | jq '. | @csv'