JSONエディターのコツ:大きなドキュメントで効率的に作業する
現代の開発ではJSONを扱うことは避けられません。APIレスポンス、設定ファイル、データベースエクスポート — JSONはあらゆる場所にあります。ファイルが数千行に達すると、効率的な編集ツールとテクニックが、数分で済むか数時間かかるかの違いを生みます。
フォーマットと可読性
自動フォーマット
大きなJSONドキュメントでまず行うべきはフォーマットです。圧縮されたJSONは読めません:
{"users":[{"id":1,"name":"Alice","roles":["admin","editor"]},{"id":2,"name":"Bob","roles":["viewer"]}]}
フォーマット済み:
{
"users": [
{
"id": 1,
"name": "Alice",
"roles": ["admin", "editor"]
},
{
"id": 2,
"name": "Bob",
"roles": ["viewer"]
}
]
}
JSONフォーマッターで即座にJSONをフォーマット — ペースト、フォーマット、コピー。
コマンドラインフォーマット
# jq - 標準ツール
cat data.json | jq .
# Python(組み込み)
python3 -m json.tool data.json
# Node.js
node -e "process.stdout.write(JSON.stringify(JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')),null,2))" < data.json
ナビゲーションテクニック
ツリービュー vs テキストビュー
1000行を超えるドキュメントでは、テキスト編集よりツリービューの方が実用的です:
- ノードの折りたたみ/展開で関連セクションに集中
- パンくずナビゲーションで階層内の現在位置を表示
- サブツリー内検索でノイズをフィルタリング
JSONPathによるターゲットアクセス
数千行をスクロールする代わりに、JSONPathで必要なデータに直接ジャンプ:
# 3番目のユーザーのメールアドレスを取得
cat users.json | jq '.[2].email'
# すべての管理者ユーザーを取得
cat users.json | jq '.[] | select(.role == "admin")'
詳しくはJSONPathクエリガイドをご覧ください。
バリデーション
構文エラーのキャッチ
よくあるJSON構文エラー:
- 末尾のカンマ:
{"a": 1, "b": 2,}— 許可されていない - シングルクォート:
{'key': 'value'}— ダブルクォートを使用すること - 引用符なしのキー:
{key: "value"}— キーは引用符で囲む必要がある - コメント:
// this breaks— JSONにはコメント構文がない
ほとんどのエディターはこれらのエラーをリアルタイムでハイライトします。クイックバリデーションには、JSONバリデーターがエラーの正確な場所を特定します。
スキーマバリデーション
構文を超えて、JSONが期待される構造に一致するか検証:
# ajv-cliを使用
npx ajv validate -s schema.json -d data.json
包括的なカバレッジについてはJSONスキーマバリデーションガイドをご覧ください。
操作テクニック
キーのソート
一貫したキー順序でdiffがクリーンに:
jq -S . data.json > sorted.json
サブセットの抽出
必要なフィールドだけを取り出す:
# 各オブジェクトから特定のフィールドを抽出
jq '[.[] | {name, email}]' users.json
# 条件でフィルタリング
jq '[.[] | select(.age > 30)]' users.json
JSONファイルのマージ
# 2つのオブジェクトをマージ
jq -s '.[0] * .[1]' base.json override.json
# 配列を結合
jq -s '.[0] + .[1]' list1.json list2.json
構造の変換
# 配列からルックアップマップを作成
jq 'INDEX(.[]; .id)' users.json
# 結果: {"1": {"id": 1, "name": "Alice"}, "2": {"id": 2, "name": "Bob"}}
# ネスト構造のフラット化
jq '[.departments[].employees[]]' org.json
大きなファイルの操作
ストリーミングパース
数ギガバイトのファイルでは、ストリーミングですべてをメモリにロードすることを回避:
# jq ストリーミングモード
jq --stream 'select(.[0][-1] == "email") | .[1]' large.json
# Python ストリーミング
import ijson
for item in ijson.items(open('large.json'), 'item'):
process(item)
分割して処理
# 大きな配列を個別ファイルに分割
jq -c '.[]' large_array.json | split -l 1000 - chunk_
# チャンクを並列処理
ls chunk_* | parallel jq '.name' {}
エディター別のヒント
VS Code
- フォーマット:
Shift+Alt+F(またはCmd+Shift+P→ "Format Document") - 折りたたみ: ガターの矢印をクリックしてセクションを折りたたむ
- JSON Schema:
"$schema"を追加して自動補完を有効化 - 設定: JSONファイルで
"editor.formatOnSave": true
JetBrains IDE
- 構造ビュー:
Alt+7でJSONツリーを表示 - ナビゲーション:
Ctrl+Clickで$refを辿る - フォーマット:
Ctrl+Alt+Lで再フォーマット
FAQ
ターミナルでJSONを編集する最善の方法は何ですか?
クイック編集には jq が最強です — 1つのコマンドでJSONのクエリ、フィルタリング、変換ができます。インタラクティブな編集には fx(npmパッケージ)がシンタックスハイライトと折りたたみ機能を備えたターミナルベースのJSONエクスプローラーを提供します。シンプルなフォーマットには、追加の依存関係なしで python3 -m json.tool が動作します。
コメント付きJSON(JSONC)はどう処理しますか?
コメント付きJSON(VS Code設定、TypeScript設定で使用)は有効なJSONではありません。strip-json-comments のようなツールでパース前にコメントを削除できます。VS Codeでは、ファイルの関連付けを "JSON with Comments" に設定して適切なシンタックスハイライトを有効にしてください。
関連リソース
- JSONフォーマッター — オンラインでJSONをフォーマット・整形
- JSONPathクエリガイド — 大きなJSONを効率的にナビゲート
- JSON Diffデバッグガイド — JSONドキュメントを比較