jqでJSONを変換する: インタラクティブガイド
(navendu.me)- jqはJSONデータを扱うためのコマンドラインツールで、ほとんどのLinuxディストリビューションに標準でインストールされている
- JSONデータを見やすく出力(pretty print)したり、フィルタを使ってデータを変換したりするのに便利
- 開発者が必ず学ぶべき5つのCLIツールに含まれるほど強力で、JSONデータを扱うさまざまな作業を簡単に実行できる
jqのインストールと基本的な使い方
-
インストール方法
- jqはほとんどのパッケージマネージャーでインストールでき、バイナリを直接ダウンロードしたりソースからビルドしたりすることも可能
- インストール後は
jqコマンドで動作確認できる
-
基本的な使用例
- JSONデータを見やすく出力:
curl 'https://jsonplaceholder.typicode.com/users/1' | jq
- JSONデータを見やすく出力:
-
JSONフィルタの例
- 特定の条件に一致するデータをフィルタリング:
curl 'https://jsonplaceholder.typicode.com/users' | jq \ '.[] | select(.address.city == "South Christy") | {name, username, email}'
- 特定の条件に一致するデータをフィルタリング:
jqの主な機能
基本フィルタ
-
Identityフィルタ
- 入力データを変更せずに出力:
echo '{"id":1,"name":"Leanne Graham","website":"hildegard.org"}' | jq '.'
- 入力データを変更せずに出力:
-
特定フィールドへのアクセス
- JSONオブジェクトの特定フィールドを選択:
curl 'https://jsonplaceholder.typicode.com/users/1' | jq '.name' - ネストされたフィールドへのアクセス:
curl 'https://jsonplaceholder.typicode.com/users/1' | jq '.address.zipcode'
- JSONオブジェクトの特定フィールドを選択:
配列処理
-
配列要素へのアクセス
- JSON配列から特定インデックスの要素を選択:
curl 'https://jsonplaceholder.typicode.com/users' | jq '.[0]'
- JSON配列から特定インデックスの要素を選択:
-
配列スライス
- 特定範囲の部分配列を抽出:
curl 'https://jsonplaceholder.typicode.com/users' | jq '.[3:6]'
- 特定範囲の部分配列を抽出:
-
配列の反復処理
- 配列の各要素に対してフィルタを適用:
curl 'https://jsonplaceholder.typicode.com/users' | jq '.[] | {name, email}'
- 配列の各要素に対してフィルタを適用:
新しいJSONの生成
-
新しいオブジェクトの生成
- 選択したフィールドで新しいJSONオブジェクトを生成:
curl 'https://jsonplaceholder.typicode.com/users/1' | jq \ '{"name": .name, "email": .email, "company": .company.name}'
- 選択したフィールドで新しいJSONオブジェクトを生成:
-
新しい配列の生成
- 変換したデータから配列を生成:
curl 'https://jsonplaceholder.typicode.com/users' | jq \ '[.[] | {name: .name, email: .email, company: .company.name}]'
- 変換したデータから配列を生成:
jqの高度な機能
関数の活用
-
長さの計算
- 文字列の長さを計算:
curl 'https://jsonplaceholder.typicode.com/users/1' | jq '.name | length'
- 文字列の長さを計算:
-
キーの抽出
- オブジェクトのキーを配列として返す:
curl 'https://jsonplaceholder.typicode.com/users/1' | jq 'keys'
- オブジェクトのキーを配列として返す:
-
map関数
- 配列の各要素にフィルタを適用:
curl 'https://jsonplaceholder.typicode.com/users' | jq \ 'map({name: .name, city: .address.city})'
- 配列の各要素にフィルタを適用:
データの選択
- 条件に一致するデータの選択
- 特定条件を満たすデータをフィルタリング:
curl 'https://jsonplaceholder.typicode.com/users' | jq \ '.[] | select(.address.city == "South Christy")'
- 特定条件を満たすデータをフィルタリング:
JSON変換と活用
-
高度なJSON変換
- データをグループ化したり統計を計算したりするフィルタ:
curl 'https://jsonplaceholder.typicode.com/users' | jq \ 'group_by(.address.city) | map({ city: .[0].address.city, user_count: length, users: [.[] | {name: .name, username: .username}] })'
- データをグループ化したり統計を計算したりするフィルタ:
-
大規模JSONの処理
- 大量のJSONデータを効率的に処理:
curl 'https://api.github.com/repos/apache/apisix/contributors?per_page=100' | jq \ 'sort_by(.contributions) | reverse | map({username: .login, contributions}) | .[0:5]'
- 大量のJSONデータを効率的に処理:
-
jq Playgroundで実際に試せる
3件のコメント
要約ありがとうございます!本当に役立つ情報ですね
> 開発者がぜひ学ぶべき5つのCLIツールに含まれるほど強力で、
でも、残り4つのCLIツールが何なのかも気になるのに、それは記事では言及されておらず、マクガフィン化していますね..
https://navendu.me/posts/jq-interactive-guide/….
原文を見ると
> jq is on every “five command line tools to learn as a developer” video on YouTube.
という一文がありますね。
残りの4つが具体的に挙げられているわけではなく、ああいう系のCLIツールおすすめ動画では毎回言及される、ということみたいですね(笑)