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'