Tips

sample.json

`jq` は、コマンドラインでJSONデータを処理するための軽量かつ強力なプロセッサです。データの整形、フィルタリング、変換などをパイプを使って簡単に行うことができます。

技術・言語・ツール: jq

jq は、コマンドラインでJSONデータを処理するための軽量かつ強力なプロセッサです。データの整形、フィルタリング、変換などをパイプを使って簡単に行うことができます。

jq でJSONデータを柔軟に抽出・整形する

APIからのレスポンスや設定ファイルなど、JSON形式のデータは開発現場で頻繁に登場します。jqを使えば、これらのデータをシェルスクリプトやパイプラインの中で効率的に操作し、必要な情報だけを抽出したり、読みやすい形式に整形したりすることが可能です。

コード例:

まず、サンプルJSONデータを用意します。

# sample.json
{
  "name": "Widget Service",
  "version": "1.2.3",
  "status": "running",
  "config": {
    "port": 8080,
    "debug": false
  },
  "metrics": [
    {"type": "cpu", "value": 0.15},
    {"type": "memory", "value": 0.60},
    {"type": "disk", "value": 0.30}
  ]
}
  1. JSONをきれいに整形して表示:

    cat sample.json | jq .
    # または単に
    jq . sample.json
  2. 特定のフィールドを抽出:

    jq .name sample.json
    # => "Widget Service"
    
    jq .config.port sample.json
    # => 8080
  3. 配列の要素をフィルタリング: 例えば、“type”が”cpu”のメトリクスだけを抽出。

    jq '.metrics[] | select(.type == "cpu")' sample.json
    # => { "type": "cpu", "value": 0.15 }
  4. 複数のフィールドを新しいオブジェクトとして抽出:

    jq '{serviceName: .name, serviceVersion: .version}' sample.json
    # => {
    #   "serviceName": "Widget Service",
    #   "serviceVersion": "1.2.3"
    # }
  5. 値に基づいて色々な処理: statusrunningの場合にのみnameversionを表示する。

    jq 'if .status == "running" then {name: .name, version: .version} else empty end' sample.json
    # => {
    #   "name": "Widget Service",
    #   "version": "1.2.3"
    # }

注意点とおすすめポイント:

  • jqのクエリは強力で柔軟ですが、慣れるまで少し学習が必要です。公式ドキュメントやオンラインのチュートリアルが豊富にあります。
  • curlでAPIからJSONデータを受け取り、それをパイプでjqに渡して必要な情報だけを抽出するといった使い方は非常に一般的で強力です。
  • 例えばkubectl get pods -o jsonのように、多くのCLIツールがJSON出力をサポートしており、jqと組み合わせることでデバッグや自動化スクリプト作成の効率が飛躍的に向上します。