JSON フォーマット & バリデーション: 完全な開発者ガイド
· 12分で読めます
目次
JSON (JavaScript Object Notation) は、Web 上でのデータ交換の事実上の標準となっています。REST API の構築、アプリケーションの設定、構造化データの保存など、JSON のフォーマットとバリデーションを理解することは、現代の開発に不可欠です。
この包括的なガイドでは、基本的な構文ルールから高度なバリデーション技術、セキュリティの考慮事項、さまざまなプログラミング言語と環境における実用的なツールまで、すべてをカバーしています。
JSON 構文ルール
JSON は、人間が読みやすく、機械が解析可能な、軽量なテキストベースのデータ交換フォーマットです。その名前は JavaScript との関連を示唆していますが、JSON は完全に言語に依存せず、事実上すべての最新のプログラミング言語でサポートされています。
このフォーマットは元々 Douglas Crockford によって仕様化され、現在は RFC 8259 で定義されています。そのシンプルさと普遍性により、API、設定ファイル、NoSQL データベース、データストレージシステムにおいて世界中で好まれる選択肢となっています。
コアデータ型
JSON は正確に6つのデータ型をサポートしており、それぞれに特定のフォーマット要件があります:
| 型 | 例 | 注意事項 |
|---|---|---|
| 文字列 | "hello world" |
ダブルクォートを使用する必要があり、Unicode エスケープシーケンスをサポート |
| 数値 | 42, 3.14, -1, 2.5e10 |
先頭のゼロなし、16進数なし、科学的記数法をサポート |
| 真偽値 | true, false |
小文字のみ、クォートなし |
| Null | null |
小文字のみ、値の欠如を表す |
| オブジェクト | {"key": "value"} |
順序なしのコレクション、キーは文字列である必要がある |
| 配列 | [1, 2, 3] |
順序付きリスト、混合型を含むことができる |
プロのヒント: 当社の JSON フォーマッター を使用して、構文ハイライトとエラー検出により、JSON を即座に検証して整形できます。
文字列エスケープルール
JSON 文字列では、特殊文字の適切なエスケープが必要です。以下は必須のエスケープシーケンスです:
\"- ダブルクォート\\- バックスラッシュ\/- スラッシュ (オプションですが有効)\b- バックスペース\f- フォームフィード\n- 改行\r- キャリッジリターン\t- タブ\uXXXX- Unicode 文字 (4桁の16進数)
エスケープ文字を含む例:
{
"message": "Line 1\nLine 2",
"path": "C:\\Users\\Documents",
"quote": "He said \"Hello\"",
"emoji": "\u2764\uFE0F"
}
数値フォーマット仕様
JSON の数値は、一部のプログラミング言語とは異なる厳格なフォーマットルールに従います:
- 先頭のゼロなし:
042は無効、42を使用 - 16進数なし:
0xFFは無効 - 8進数なし:
0o77は無効 - 小数点には数字が必要:
.5は無効、0.5を使用 - 科学的記数法が許可される:
1.5e10,2E-5 - 特殊な値なし:
NaN,Infinity,-Infinityは無効
よくある JSON エラーと修正方法
経験豊富な開発者でも JSON 構文のミスをします。最も一般的なエラーを理解することで、より速くデバッグし、最初から有効な JSON を書くことができます。
| エラー | 無効な例 | 有効な例 | 説明 |
|---|---|---|---|
| 末尾のカンマ | {"a": 1,} |
{"a": 1} |
JSON ではオブジェクトや配列の末尾のカンマは許可されません |
| シングルクォート | {'a': 'b'} |
{"a": "b"} |
文字列とキーにはダブルクォートのみが有効です |
| クォートなしのキー | {name: "John"} |
{"name": "John"} |
オブジェクトのキーは常にクォートで囲まれた文字列である必要があります |
| コメント | {"a": 1} // comment |
許可されません | JSON 仕様はコメントをサポートしていません |
| 裸の値 | hello |
"hello" |
トップレベルの値はオブジェクト、配列、またはクォートで囲まれた文字列である必要があります |
| Undefined | {"a": undefined} |
{"a": null} |
undefined の代わりに null を使用 |
| クォートの欠落 | {"date": 2024-01-01} |
{"date": "2024-01-01"} |
数値以外の値にはクォートが必要です |
クイックヒント: 当社の JSON バリデーター を使用して、問題が発生している正確な場所を示す詳細なエラーメッセージでこれらのエラーを即座にキャッチできます。
パースエラーのデバッグ
JSON のパースが失敗すると、エラーメッセージは多くの場合、文字位置を指し示します。一般的なエラーメッセージの解釈方法は次のとおりです:
- "Unexpected token" - 通常、構文文字が間違った場所にあることを意味します (カンマ、ブラケット、クォート)
- "Unexpected end of input" - 閉じブラケット、ブレース、またはクォートが欠落しています
- "Expected property name" - オブジェクトキーが欠落しているか無効です
- "Unexpected string" - オブジェクトプロパティまたは配列要素間のカンマが欠落しています
最新のバリデーターのほとんどは、エラーが発生した正確な行と列を表示するため、手動検査よりもはるかに高速にデバッグできます。
フォーマットと整形出力
最小化された JSON はコンパクトでデータ転送に効率的ですが、人間が読むことはほぼ不可能です。整形出力は、構造を明確でナビゲート可能にするために空白を追加します。
最小化 vs 整形出力
両方のフォーマットで同じデータを示します:
// 最小化 (1行、68バイト)
{"name":"John","age":30,"city":"New York","skills":["JavaScript","Python"]}
// 2スペースインデントで整形出力 (6行、108バイト)
{
"name": "John",
"age": 30,
"city": "New York",
"skills": ["JavaScript", "Python"]
}
最小化バージョンは40バイト (37%削減) を節約しますが、すべての可読性を犠牲にします。本番 API では、最小化された JSON は帯域幅を削減し、パフォーマンスを向上させます。開発、設定ファイル、デバッグには、整形出力された JSON が不可欠です。
インデントスタイル
異なるコミュニティには、インデントに対する異なる好みがあります:
- 2スペース - Web 開発、JavaScript、JSON API で最も人気
- 4スペース - Python プロジェクトやエンタープライズ Java アプリケーションで一般的
- タブ - JSON ではあまり一般的ではありませんが、アクセシビリティのために一部のプロジェクトで使用されます
重要なのは、プロジェクト内での一貫性です。ほとんどのチームは、リンティングツールとエディタ設定を通じてこれを強制します。
プロのヒント: 保存時に JSON をフォーマットするようにエディタを設定します。VS Code ユーザーは、設定に "editor.formatOnSave": true を追加し、JSON フォーマッター拡張機能をインストールできます。
オブジェクトキーのソート
JSON オブジェクトは技術的には順序なしですが、キーをアルファベット順にソートすると、可読性が向上し、バージョン管理での差分がよりクリーンになります:
// ソートなし
{
"version": "1.0",
"name": "myapp",
"author": "John Doe",
"dependencies": {}
}
// アルファベット順にソート
{
"author": "John Doe",
"dependencies": {},
"name": "myapp",
"version": "1.0"
}
多くの JSON フォーマッターは、オプションとして自動キーソートを提供しています。これは、複数の開発者によって頻繁に編集される設定ファイルに特に便利です。
JSONPath クエリ
JSONPath は、JSON ドキュメントからデータを抽出するためのクエリ言語を提供します。これは、XPath が XML に対して機能するのと同様です。複雑なネストされた構造を扱う場合や、特定の値をプログラムで抽出する必要がある場合に非常に貴重です。
基本的な JSONPath 構文
JSONPath 式は、ルート要素を表す $ で始まり、その後に子演算子とフィルターが続きます:
| 式 | 意味 | 結果例 |
|---|---|---|
$ |
ルート要素 | ドキュメント全体 |
$.store.book |
ストア内のすべての本 | 本オブジェクトの配列 |
$.store.book[0] |
最初の本 | 単一の本オブジェクト |
$.store.book[-1] |
最後の本 | 単一の本オブジェクト |
$.store.book[0,2] |
最初と3番目の本 | 2冊の本を含む配列 |
$.store.book[0:2] |
最初の2冊の本 (スライス) | 2冊の本を含む配列 |
$.store.book[*].title |
すべての本のタイトル | 文字列の配列 |
$..price |
すべての価格 (再帰的) | 数値の配列 |
$.store.book[?(@.price<10)] |
10ドル未満の本 | フィルタリングされた配列 |
$.store.book[?(@.category=='fiction')] |
フィクションの本 | フィルタリングされた配列 |
クイックヒント: 当社の JSONPath ファインダー ツールで JSONPath クエリをインタラクティブにテストして、リアルタイムで結果を確認できます。
高度なフィルタリング
JSONPath は、比較演算子と論理条件を使用した複雑なフィルター式をサポートしています:
==- 等しい (一部の実装では単一の = を使用)!=- 等しくない<,<=,>,>=- 比較演算子&&- 論理 AND||- 論理 OR@- フィルター内の現在のノード
複数の条件を持つ例:
// フィクションで15ドル未満の本を検索
$.store.book[?(@.category=='fiction' && @.price<15)]
// 特定の著者による本を検索
$.store.book[?(@.author=='Tolkien' || @.author=='Rowling')]
// ISBN を持つ本を検索
$.store.book[?(@.isbn)]
実用的なユースケース
JSONPath は、いくつかの実世界のシナリオで優れています:
- API レスポンスのパース - 手動トラバースなしで複雑な API レスポンスから特定のフィールドを抽出
- 設定管理 - 大きな設定ファイル内のネストされた設定値をクエリ
- データ変換 - ETL パイプライン用にデータを選択して再形成
- テストと検証 - API テストスイートで特定の値をアサート
- ログ分析 - 構造化された JSON ログから関連フィールドを抽出
JSON スキーマバリデーション
JSON スキーマは、JSON ドキュメントに注釈を付けて検証できる語彙です。JSON データの契約を提供し、特定の構造と型の要件を満たすことを保証します。
JSON スキーマを使用する理由
スキーマバリデーションは、いくつかの重要な利点を提供します:
- データバリデーション - 受信データが期待される構造と一致することを自動的に検証
- ドキュメント - スキーマは機械可読なドキュメントとして機能
- コード生成 - スキーマから型、クラス、バリデーションコードを生成
- API 契約 - サービス間の明確な契約を定義
- エラー防止 - ランタイムエラーを引き起こす前にデータの問題をキャッチ
基本的なスキーマの例
ユーザーオブジェクトを定義する簡単なスキーマは次のとおりです:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"email": {
"type": "string",
"format": "email"
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"roles": {
"type": "array",
"items": {
"type": "string",
"enum": ["admin", "user", "guest"]
},
"minItems": 1,
"uniqueItems": true
}
},
"required": ["name", "email"],
"additionalProperties": false
}
このスキーマは、有効なユーザーオブジェクトが名前とメールを持つ必要があり、特定の制約を満たすオプションの年齢とロールフィールドを持つことを強制します。