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ベースのストレージシステムでの国際テキスト処理に不可欠です。

試してみる — String Escape/Unescape

フルツールを開く