jqコマンドのインストール
MacOSX環境の場合、HomeBrew経由で簡単にインストールすることができます。
% brew install jq
JSONデータの整形
echoコマンドを使って簡易的なJSONを出力し、jqコマンドに渡してみます。
% echo '{"key":"value"}' | jq .
{
"key": "value"
}
正常にパースされ、整形された状態で出力されました。
続いて、壊れたJSONデータを渡してみます。
% echo '{"key":value}' | jq .
parse error: Invalid numeric literal at line 1, column 13
パースエラーが表示されました。
特定ノードの抽出
下記サイトからJSONのサンプルデータを拝借することにします。
http://json.org/example.html
example.json
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
titleノードの値を抽出
"."がルートノードを表し、続けてノード名を指定することができます。
% cat example.json | jq .glossary.title
"example glossary"
指定したノードの値が取り出せました。"-r"オプションを指定することでダブルクオートを除去することができます。
% cat example.json | jq -r .glossary.title
example glossary
配列から値を検索
サンプルデータの"GlossSeeAlso"ノードは配列になっています。ここから"XML"の値だけ取り出してみることにします。
% cat example.json | jq '.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[] | select(. == "XML")'
"XML"
jqコマンドにはいくつかの組み込みフィルタが内蔵しており、"select"のように条件で絞り込むことや演算をおこなうこともできます。