みなさん、こんにちは。
IoTやWeb APIの世界で仕事をしていると、必ずと言っていいほど出てくるのが JSON(ジェイソン) です。でも正直「なんとなく使っているだけで、深く理解していない」という方も多いのではないでしょうか。今回はそんなエンジニアに向けて、JSONとは何か、どこで使うのか、そしてjqを使ってどう便利に扱うか をまとめてみました。
JSONとは?
JSONは JavaScript Object Notation の略で、データをやり取りするためのシンプルなフォーマットです。例えば、センサーの温度データをAPIで送信する場合、こんな形式で表現されます。
{
"device_id": "sensor01",
"temperature": 23.4,
"timestamp": "2025-09-23T10:15:00Z"
}
ポイントは以下の3つです。
- キーと値のペア でデータを表す
- 値には 文字列・数値・真偽値・配列・オブジェクト が入る
- 人間にも読みやすく、機械にも扱いやすい
XMLのようにタグで囲む必要がなく、軽量でシンプルです。そのためIoTの世界では、センサー → ゲートウェイ → クラウドAPI のデータ連携で大活躍しています。
JSONが使われる場面
IoTエンジニアがJSONを触るのは主にこんなときです。
- APIのリクエストやレスポンス
- クラウドにデータを送ったり取得したりするときに必ずJSON形式。
- ログや設定ファイル
- 最近はYAMLも増えましたが、設定をJSONで持つケースも依然多いです。
- メッセージングやMQTT
- トピックに載せるデータもJSONが一般的。
つまり「IoTエンジニアを名乗るなら、JSONを読み書きできないと仕事にならない」くらい重要なのです。
jqとは?
JSONを扱うときに出てくる最強のコマンドラインツールが jq です。
jqのインストール
Windows、Linux、Macのそれぞれの環境で、以下の方法でインストールできます。
Windows(Scoop)
パッケージ管理ツール Scoop を使ってインストールするのが簡単です。PowerShellで以下のコマンドを実行します
scoop install jq
※ Scoopが未導入の場合は、先に公式サイトの手順でインストールしてください。
Windows(手動)
jqの公式サイト から jq-win64.exe
をダウンロードします。
ダウンロードしたファイルを任意の場所に配置します(例: C:\tools\jq
)。
環境変数PATH に配置したフォルダのパスを追加します。これにより、コマンドプロンプトやPowerShellのどこからでも jq
が使えるようになります。
Linux(apt)
sudo apt install jq
Mac(Homebrew)
brew install jq
インストールが完了したら、ターミナルで jq --version
と実行してバージョンが表示されればOKです。
jqは「JSON専用のsed/awk/grep」と呼ばれることもあり、以下のことが得意です。
- JSONをきれいに整形して表示する
- JSONから欲しい要素だけ抜き出す
- JSONを加工して別のJSONに変換する
IoTの現場だと「APIレスポンスをそのままターミナルで見やすくしたい」ときや「センサーの値だけ抜き出したい」ときにめちゃくちゃ便利です。
jqの基本操作
整形表示
まずは整形。JSONをパイプで渡すとインデント付きで表示してくれます。
# Windows
type data.json | jq .
# Linux/Mac
cat data.json | jq .
ぐちゃっとしたAPIレスポンスもこれで一気に見やすくなります。
値の抽出
キーを指定すると値だけを取り出せます。
# Windows
type data.json | jq '.temperature'
# Linux/Mac
cat data.json | jq '.temperature'
出力例:
23.4
配列から要素を抜きたい場合はインデックスを使います。
# Windows
type devices.json | jq '.[0].device_id'
# Linux/Mac
cat devices.json | jq '.[0].device_id'
条件で絞り込み
select
を使えばフィルタリングも可能。
# Windows
type devices.json | jq '.devices[] | select(.status=="active")'
# Linux/Mac
cat devices.json | jq '.devices[] | select(.status=="active")'
「稼働中のデバイスだけ抜き出す」みたいな使い方です。
少し高度な活用
map でまとめて変換
全デバイスのIDだけをリスト化する場合はこう書きます。
# Windows
jq '.devices | map(.device_id)' devices.json
# Linux/Mac
jq '.devices | map(.device_id)' devices.json
結果は配列として出力されます。
group_by でグルーピング
例えばセンサーの種類ごとにデータをまとめたいとき。
Bash
# Windows
jq '.sensors | group_by(.type)' sensors.json
# Linux/Mac
jq '.sensors | group_by(.type)' sensors.json
データの整理や統計的な処理の前処理に便利です。
reduce で集計
温度データの平均を計算する例。
# Windows
jq '[.temperatures[].value] | add / length' temps.json
# Linux/Mac
jq '[.temperatures[].value] | add / length' temps.json
jqだけで集計までできるので物凄く重宝します。
つまずきやすいポイント
ここからが本題。多くのエンジニアが「なんでうまくいかないの?」と悩む落とし穴を紹介します。
1. ダブルクオート必須問題
JSONは必ず ダブルクオート でキーを囲む必要があります。 シングルクオートを使うと即エラーです。
{ 'key': 'value' } # NG
{ "key": "value" } # OK
2. シェルとのクオート競合
jqのクエリもクオートで囲むので、シェルとバッティングしがちです。
jq '.devices[] | select(.status=="active")' # OK
間違ってシングルとダブルを混ぜると想定外の結果になります。複雑になったら外側をシングル、内側をダブルと覚えておくのがコツです。
3. 配列の展開の違い
jq '.devices'
と jq '.devices[]'
の違いも初心者が混乱するポイント。
.devices
→ 配列そのものを返す.devices[]
→ 配列の中身を1つずつ展開する
パイプでつないで処理する場合は []
を忘れると意図した結果が得られません。
4. 数値と文字列の違い
APIレスポンスの仕様で数値が文字列になっていることもあります。
{ "temperature": "23.4" }
この場合、jqで数値計算しようとするとエラーになります。.temperature | tonumber
として型変換してから扱うのがベストです。
IoTエンジニアにとってのjq活用シーン
- センサー値の監視
- APIレスポンスから数値だけ抜き出して
watch
コマンドで監視。
- APIレスポンスから数値だけ抜き出して
- テストデータの加工
- 生のJSONをフィルタして、シミュレーション用に整形。
- ログの解析
- 膨大なログから特定デバイスのエラーだけを抽出。
GUIでゴリゴリやるより、ターミナルで一発コマンドのほうが速くて正確です。
まとめ
IoTの世界で欠かせないデータ形式であるJSONは、その整形・抽出・加工を一気に楽にしてくれる強力なコマンドラインツール、jq と組み合わせて使うことで真価を発揮します。
つまずきやすいクオート問題や配列展開、型の違いに注意すれば、map
、select
、group_by
といった高度な機能も使いこなせます。jqは「知らなくても困らないけど、知っていると爆速で仕事が進む」ツールであり、IoTエンジニアの作業効率を飛躍的に向上させてくれます。
ぜひ活用してみてください!
本日も最後までお読みいただきありがとうございました。
それでは、よいIoTライフを!