JSON文字列エスケープのルールとエッジケース
RFC 8259で定義されたJSON文字列エスケープの完全ガイド。必須のエスケープシーケンス、Unicodeエンコーディング、制御文字の処理、JSON文字列を手動で構築する際のよくある落とし穴を解説します。
Data Formats
詳細な説明
JSON文字列のエスケープ
JSON(RFC 8259)は厳格かつ限定的なエスケープルールを持っています。ほとんどのプログラミング言語とは異なり、JSONは特定のエスケープシーケンスセットのみを許可し、それ以外はパースエラーになります。
必須エスケープシーケンス
JSONでは文字列内でこれらの文字のエスケープが必須です:
\\" → ダブルクォート(U+0022)
\\\\ → バックスラッシュ(U+005C)
\\/ → フォワードスラッシュ(U+002F)— オプションだが許可
\\b → バックスペース(U+0008)
\\f → フォームフィード(U+000C)
\\n → 改行/ラインフィード(U+000A)
\\r → キャリッジリターン(U+000D)
\\t → タブ(U+0009)
\\uXXXX → 任意のUnicode文字(ちょうど16進4桁)
JSONがサポートしないもの
- シングルクォート: JSON文字列はダブルクォートを使用する必要があります。
'hello'は無効なJSON。 - 16進エスケープ:
\\xHHはJSONでは無効。代わりに\\u00HHを使用。 - 8進エスケープ:
\\0、\\377は無効。 - 名前付きエスケープ:
\\a(アラート)、\\v(垂直タブ)は無効。 - 生の制御文字: U+0000からU+001Fの文字は
\\uXXXXとしてエスケープが必須。
Unicodeサロゲートペア
基本多言語面(BMP)外の文字(U+FFFF以上)はサロゲートペアとしてエンコードする必要があります。
フォワードスラッシュのエスケープ
/ を \\/ としてエスケープすることは有効ですが必須ではありません。HTML <script> タグ内にJSONを埋め込む際の便宜のために存在します。
手動構築の落とし穴
文字列連結によるJSON文字列の手動構築はエラーが発生しやすいです。必ず適切なJSONシリアライザ(JSON.stringify()、json.dumps()、Jackson など)を使用してください。
ユースケース
JSONエスケープの知識は、API開発、設定ファイル管理、データシリアライゼーション、ログファイル解析、シェルスクリプトでのJSONペイロード構築、予期しない文字を含むAPIレスポンスのデバッグ、JSONテンプレートの構築、JSONベースのストレージシステムでの国際テキスト処理に不可欠です。