LoginSignup
7

More than 5 years have passed since last update.

コマンドラインでJSONデータを扱う

Last updated at Posted at 2016-11-28

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"のように条件で絞り込むことや演算をおこなうこともできます。

参考

jq Manual (development version)
jq コマンドを使う日常のご紹介

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7