TL;DR — ワンライナー
jq が入っていれば、これで終わりです。
curl -s https://api.example.com/users/1 | jq .
jq がなければ、ほとんどの環境に入っている Python が使えます。
curl -s https://api.example.com/users/1 | python3 -m json.tool
ブラウザ派なら、curl の結果を FormatArc JSON Formatter に貼り付けるだけです。インストール不要で、初回ロード後はオフラインでも動きます。以下では 4 つの方法を比較し、どの場面でどれを選ぶかが分かるようにしています。
curl のレスポンスが読みにくい理由
API の動作確認で curl を使うと、レスポンスの JSON がこのように返ってきます。
curl -s https://api.example.com/users/1
{"id":1,"name":"Tanaka","email":"tanaka@example.com","address":{"city":"Tokyo","zip":"100-0001"},"roles":["admin","editor"]}
改行もインデントもないため、ネストが深くなるほど構造の把握が難しくなります。ここからは、この出力を見やすく整形する 4 つの方法を紹介します。
jq で整形する
JSON の整形ツールとしては jq が最も広く使われています。
jq のインストール
# macOS
brew install jq
# Ubuntu / Debian
sudo apt install jq
# Windows (Chocolatey)
choco install jq
基本的な使い方
curl の出力をパイプで jq に渡すだけです。
curl -s https://api.example.com/users/1 | jq .
{
"id": 1,
"name": "Tanaka",
"email": "tanaka@example.com",
"address": {
"city": "Tokyo",
"zip": "100-0001"
},
"roles": [
"admin",
"editor"
]
}
-s オプションで curl のプログレスバーを非表示にしています。
よく使うフィルタ
jq は整形だけでなく、特定のフィールドを抽出するフィルタとしても使えます。
特定のキーを取得する場合はこちらです。
curl -s https://api.example.com/users/1 | jq '.name'
"Tanaka"
ネストされたキーにはドットでアクセスします。
curl -s https://api.example.com/users/1 | jq '.address.city'
"Tokyo"
配列から全要素の特定フィールドを抽出する場合は [] を使います。
curl -s https://api.example.com/users | jq '.[].name'
"Tanaka"
"Suzuki"
"Sato"
条件でフィルタする場合は select を使います。
curl -s https://api.example.com/users | jq '.[] | select(.roles[] == "admin")'
curl で取ってきた配列レスポンスを Markdown 表にしたい場合は API レスポンスの JSON を Markdown 表にする を参照してください。jq / Python / Node での配列切り出しから CSV 経由の表化までまとめています。
curl -i でレスポンスヘッダーと JSON を同時に整形する
ここまでの -s を使った例は、レスポンスボディ以外をすべて捨てています。API をデバッグしていてヘッダーとボディの両方を確認したいときは curl -i を使いたくなります。ただし curl -i | jq . は必ず失敗します。ストリームの先頭にあるヘッダーのブロックが JSON ではないためです。
curl -is https://api.example.com/users/1 | jq .
# parse error: Invalid numeric literal at line 1, column 9
ヘッダーは表示したまま、jq には JSON ボディだけを渡す必要があります。
ストリームを分割する: ヘッダーは stderr、ボディは stdout へ
curl -D <ファイル> は指定したファイルにレスポンスヘッダーを書き込みます。/dev/stderr を指定すればヘッダーはターミナルに表示され、stdout には jq に渡す準備ができたボディだけが残ります。
curl -sSD /dev/stderr https://api.example.com/users/1 | jq .
HTTP/2 200
content-type: application/json
cache-control: no-store
date: Mon, 19 May 2026 09:30:00 GMT
{
"id": 1,
"name": "Tanaka",
...
}
ヘッダーはターミナルに届きますが、パイプには入らないため jq には有効な JSON だけが渡ります。Windows の PowerShell には /dev/stderr が存在しないため、ファイルに書き出してから cat してください(下記のファイル分割パターンを参照)。
ファイルに分割する: ヘッダーとボディを別々に保存する
後で調査するために両方を残したい場合(失敗したリクエストを切り分けて保存する場合など)は、-D と -o で 2 つのファイルに分割します。
curl -sSD head.txt -o body.json https://api.example.com/users/1
cat head.txt
jq . body.json
これは macOS・Linux・Windows(どのシェルでも)で同じように動作します。あとでヘッダーを grep したい場合や、バグレポートに添付したい場合に使ってください。
恒久的な alias にする
ほとんどの場合は 1 つの短いコマンドで済ませたいはずです。~/.bashrc や ~/.zshrc に次を追加します。
alias curl-json='curl -sSD /dev/stderr'
curl-json-format() { curl-json "$@" | jq .; }
これで curl-json-format https://api.example.com/users/1 を実行すると、ヘッダーがターミナルに表示され、その下に整形済みの JSON が続きます。関数名はシェルの履歴にある他のコマンドと衝突しないよう、あえて具体的にしてあります。
curl 7.82 以降の --json ショートカット(リクエスト側)
レスポンスの整形とは逆に、リクエストで JSON を送る場面もあります。curl 7.82(2022 年 3 月)以降、--json ショートカットを使うと Content-Type: application/json・Accept: application/json・--data を 1 つのフラグでまとめて指定できます。
curl --json '{"name":"alice"}' https://api.example.com/users
これ単体ではレスポンスは整形されません。ボディを整形するには jq か、この記事で紹介している方法のいずれかにパイプしてください。ただしリクエスト側の例からよくある 3 つのフラグを消せるので、リクエストには --json、レスポンスには curl-json-format を組み合わせると、どの REST API に対してもすっきりした 2 ステップのパターンになります。
チェックリスト: curl のレスポンスは本当に有効な JSON か
jq や json.tool などのフォーマッタにレスポンスを流す前に、2 つの点を確認します。サーバーがボディを JSON として宣言しているか、そしてボディ自体が整形式かどうかです。JSON のデータ交換フォーマットは RFC 8259 (STD 90)別タブで開きます で定義されており、文法は json.org別タブで開きます にまとめられています。次のチェックリストを使ってください。
- Content-Type が
application/jsonであること。RFC 8259 は JSON のメディアタイプとしてapplication/jsonを登録しています。curl -iまたは上記のcurl -sSD /dev/stderrパターンでレスポンスヘッダーを確認し、content-typeの行がapplication/jsonになっているか確かめます。text/htmlのようなタイプは、JSON の代わりにエラーページ・ログインリダイレクト・プロキシのレスポンスが紛れ込んでいることを意味する場合がほとんどです。 - ボディが整形式の JSON であること。JSON テキストは単一の値でなければなりません。オブジェクト・配列・文字列・数値、またはリテラル
true/false/nullのいずれかです (RFC 8259 セクション 2)。オブジェクトのキーは二重引用符付きの文字列でなければならず、シングルクォートは使えず、末尾カンマも無効です。RFC 8259 (セクション 8.1) は、閉じたエコシステムに属さないシステム間で交換される JSON を UTF-8 でエンコードすることを要求しています。 - エラーなくパースできること。実用上のテストは、パーサーがボディを受け付けるかどうかです。
jq .やpython3 -m json.toolが整形済みの出力ではなくパースエラーを返す場合、Content-Type ヘッダーの値にかかわらず、そのボディは有効な JSON ではありません。コメント (//や/* */) は JSON の一部ではなく、それらを含むボディは JSON ではなく JSONC または JSON5 です。
Python の json.tool で整形する
Python がインストール済みの環境なら、追加のツールは不要です。標準ライブラリの json.tool モジュールがそのまま使えます。
curl -s https://api.example.com/users/1 | python3 -m json.tool
{
"id": 1,
"name": "Tanaka",
"email": "tanaka@example.com",
"address": {
"city": "Tokyo",
"zip": "100-0001"
},
"roles": [
"admin",
"editor"
]
}
jq のようなフィルタ機能はありませんが、整形するだけなら十分です。Python 2 の環境では python コマンドに読み替えてください。
非ASCII文字は既定で \uXXXX にエスケープされる
json.tool は既定で日本語やアクセント記号付きの文字を \uXXXX 形式にエスケープします。
echo '{"city":"Bogotá","msg":"情報","p":"informação"}' | python3 -m json.tool
{
"city": "Bogot\u00e1",
"msg": "\u60c5\u5831",
"p": "informa\u00e7\u00e3o"
}
これは壊れているのではなく仕様どおりの挙動です。JSON の文字列は Basic Multilingual Plane の文字を逆スラッシュ + u + 4桁の16進数という6文字のエスケープ列で表現できると定められています(RFC 8259 セクション7別タブで開きます)。ただし日本語のログをそのまま目で追いたいときには読みにくくなります。
--no-ensure-ascii を付けると元の文字のまま出力されます。このフラグは Python 3.9 で追加されました(Python 公式ドキュメント別タブで開きます)。
echo '{"city":"Bogotá","msg":"情報","p":"informação"}' | python3 -m json.tool --no-ensure-ascii
{
"city": "Bogotá",
"msg": "情報",
"p": "informação"
}
jq は挙動が逆です。既定では非ASCII文字をそのままUTF-8で出力し、-a(--ascii-output)を付けると \uXXXX にエスケープします(jq マニュアル別タブで開きます)。
echo '{"city":"Bogotá","msg":"情報","p":"informação"}' | jq -a .
{
"city": "Bogot\u00e1",
"msg": "\u60c5\u5831",
"p": "informa\u00e7\u00e3o"
}
実測結果(Python 3.14.6 / jq 1.7.1)はリポジトリ内 scripts/benchmarks/json-tool-non-ascii/ にコミットしてあります。
formatarc CLI で整形する
インストールと使い方
formatarc は npx で即時実行できます。インストール不要です。
curl -s https://api.example.com/users/1 | npx formatarc json-format
{
"id": 1,
"name": "Tanaka",
"email": "tanaka@example.com",
"address": {
"city": "Tokyo",
"zip": "100-0001"
},
"roles": [
"admin",
"editor"
]
}
頻繁に使うなら、グローバルにインストールしておくと起動が速くなります。
npm install -g formatarc
curl -s https://api.example.com/users/1 | formatarc json-format
YAML / CSV 変換もパイプで使える
formatarc は JSON 整形だけでなく、そのまま YAML や CSV への変換もできます。
curl -s https://api.example.com/users/1 | npx formatarc json-to-yaml
id: 1
name: Tanaka
email: tanaka@example.com
address:
city: Tokyo
zip: "100-0001"
roles:
- admin
- editor
CLI の詳しい使い方は formatarc CLI の導入ガイド で紹介しています。
ブラウザで整形する
FormatArc JSON Formatter の使い方
コマンドラインを使わない方法もあります。curl の出力をコピーして JSON Formatter に貼り付ければ、ワンクリックで整形できます。
手順はシンプルです。
- curl のレスポンスをコピーする
- FormatArc JSON Formatter を開く
- 左側のテキストエリアに貼り付ける
- 「Format」ボタンを押す
整形結果はそのままコピーしたり、YAML / CSV に変換したりできます。
貼り付ける前に一つ確認しておきたいことがあります。curl のレスポンスには Authorization ヘッダの内容やセッショントークン、顧客データが含まれていることがあり、オンライン整形ツールの多くは貼り付けた内容をサーバーに送信します。FormatArc はブラウザ内だけで変換するので手元から出ませんが、オンライン変換ツールが安全かどうかの見分け方 は本番 API のレスポンスをどこかに貼る前に知っておく価値があります。
エラーがあった場合
JSON に構文エラーがあると、整形に失敗します。よくある原因と対処法は JSON Parse Error の解決方法 にまとめています。
API のレスポンスに // や /* */ のコメントが含まれていて jq や json.tool でパースに失敗する場合は、JSONC / JSON5 形式の可能性があります。対応方法は JSON コメントの書き方 を参照してください。
URL を開いた瞬間にブラウザで自動整形したい場合は、curl とは別の選択肢として Chrome 拡張も使えます。比較は Chrome JSON 整形拡張おすすめ比較 を参照してください。
どの方法を選ぶか
| 方法 | インストール | フィルタ機能 | おすすめの場面 |
|---|---|---|---|
| jq | 必要 | 高機能 | 日常的に API を扱う開発者 |
| Python json.tool | 不要(Python 必須) | なし | 手軽に整形したいとき |
| formatarc CLI | npx で即実行 | なし(変換は可能) | JSON 以外の変換も必要なとき |
| ブラウザ(FormatArc) | 不要 | なし | コマンドラインが苦手な場合 |
jq を普段使いしつつ、YAML や CSV への変換が必要なときに formatarc CLI を併用するのが効率的です。
関連記事
- JSON 整形の方法
- formatarc CLI の使い方
- JSON Parse Error の解決方法
- JSON の書き方ガイド
- JSON コメントの書き方
- Chrome JSON 整形拡張おすすめ比較
- API レスポンスの JSON を Markdown 表にする — curl + jq で取った配列を README に貼る Markdown 表化ワークフロー
まとめ
curl で取得した JSON を整形する方法を4つ紹介しました。jq はフィルタ機能も含めて最も高機能ですが、単純な整形なら Python の json.tool でも十分です。YAML や CSV への変換が必要な場合は formatarc CLI が便利です。ブラウザで手軽に試したい場合は FormatArc JSON Formatter をお使いください。

