JSON エスケープツール
JSON文字列のエスケープ・アンエスケープを高速処理
変換方法を選択
JSON エスケープとは?
JSON エスケープは、JSON文字列内の特殊文字をエスケープシーケンスに変換するプロセスです。一般的なエスケープ文字には、" を \" に、\\ を \\\\ に、改行を \n に、タブを \t にするなどがあります。
使用例:JSONデータを別のJSON文字列内に埋め込む場合、コード内で特殊文字を含むJSON文字列定数を定義する場合、データベースにJSONデータを保存する場合などにエスケープが必要です。
使い方
使い方
- 入力ボックスにテキストを貼り付けるか入力します
- 「JSON Escape」をクリックして特殊文字をエスケープします(例:" → \")
- 「JSON Unescape」をクリックしてエスケープされた文字を元に戻します(例:\" → ")
- 結果は下部に自動表示され、そのままコピーできます
エスケープに関する注意
- 対象のコンテキストに合わせてエスケープしてください。JSON文字列、JavaScriptソース、URL、HTML属性ではエスケープルールが異なります。
- エスケープを解除したあと、設定ファイルに貼り付ける前に改行・バックスラッシュ・引用符を確認してください。
利用シーン
仕組み
JSON(RFC 8259)は厳密なテキスト文法であり、すべての文字列リテラルはASCIIダブルクォート(U+0022)で囲む必要があり、文法を壊す可能性のある文字はすべてバックスラッシュエスケープで表現しなければなりません。必須エスケープは以下の通りです:ダブルクォートはバックスラッシュ+クォートに、バックスラッシュはダブルバックスラッシュに、U+0000からU+001Fまでの32個の制御文字(\b U+0008、\f U+000C、\n U+000A、\r U+000D、\t U+0009を含む)は対応するエスケープシーケンスに変換されます。U+001Fより上の文字はCJK漢字、絵文字、アクセント付き文字、その他の補助文字を含め、生のUTF-8バイト列としてそのまま文字列内に記述できます。フォワードスラッシュのエスケープ(\/)は任意ですが、JSONがHTMLの<script>タグ内に埋め込まれる場合は、終了スクリプトタグのシーケンスが周囲のscript要素を誤って閉じないようにする慣例があります。 実際には2層のエスケープが登場します。JSONエスケープ(構文的な置換)はRFC 8259が要求する唯一のもので、文字列が有効なJSONであることを保証します。Unicodeエスケープ(各文字を\uXXXXや\u{XXXXX}に書き換える)は表現の選択であり、構文的な要求ではありません。ファイル上の見た目が変わるだけで、デコード結果は変わりません。CJKテキストは生のUTF-8バイト列としてすでにJSONとして有効であり、ページのUnicodeエスケープモードでは\uXXXXに書き換えられます。これはJavaやJavaScriptのソースファイルに文字列を渡す際にマルチバイトUTF-8を扱う必要をなくすのに便利ですが、文字あたり4〜6バイト増加し可読性が低下します。 エスケープルールにはエッジケースがあります。JSON.parseは先頭のゼロ(01はパースエラー。JavaScriptでは8進数の1として受け入れられるが)に厳格です。V8のJSON.stringifyは最小限のエスケープを常に生成し(制御文字は可能な限り\b/\n/\r/\t/\fに、それ以外は\uXXXXに、スラッシュ/、U+2028、U+2029は可読性のために生のまま残す)、孤立サロゲート(高位サロゲートの後に低位サロゲートが続かないもの)はRFC 8259上は有効なJSONですが、厳密モードやTypeScriptではInvalidStringとして拒否されます。ページのエスケープモードでは孤立サロゲートを\uFFFD(置換文字)に置き換え、どの標準パーサーでもラウンドトリップできるようにします。 JavaScriptソースコードへの埋め込みには3層目のエスケープが必要です。JS文字列リテラル内のJSON文字列ではバックスラッシュ自体をエスケープする必要があります。ページのJS文字列出力モードはこの二重エスケープを追加し、evalボタンやJSON.parseボタンが2つのエンコーディングが同じ文字列にデコードされることを示します。HTMLへの埋め込みコンテキストでは4層目が追加されます。<、>、&は周囲ページでHTMLエンティティエスケープが必要で、属性値ではクォートのエスケープも必要です。JSON-in-HTMLは有名に危険(前述の</script>の落とし穴)であり、textContentの代入や<script type="application/json">ブロックへのJSON.stringify出力(script.textContentで読み取り、evalは使用しない)のような安全なシンクの使用が推奨されます。 JSON5(人気のあるスーパーセット)はシングルクォート文字列、複数行文字列、クォートなしキー、末尾カンマ、NaN/Infinity、単行コメント//を追加します。本ページはJSON5出力を生成しません。ラウンドトリップが必要な場合は専用ライブラリを使用してください。
- JSON文字列(RFC 8259)では、ダブルクォートをバックスラッシュ+クォートに、バックスラッシュをダブルバックスラッシュに、32個の制御文字U+0000..U+001F(\b \f \n \r \t、残りは\uXXXX)にエスケープする必要があります。U+001Fより上はCJK、絵文字、アクセント付き文字を含め生のUTF-8として有効です。
- 2層の「エスケープ」が存在します:JSONエスケープ(構文的、必須)は文字列を有効なJSONにし、Unicodeエスケープ(表現的)は文字を\uXXXXに書き換え、可読性のみを変更し有効性は変えません。
- 任意の「/」:JSONでは/を\/にエスケープできます。慣例として、HTMLの<script>内にJSONを埋め込む場合は終了スクリプトタグのシーケンスが周囲のタグを閉じないようにエスケープします。
- CJKは生のUTF-8 JSONではエスケープされません:例「こんにちは」は6バイトの生データです。ページのUnicodeエスケープモードでは\u3053\u3093\u306b\u3061\u306fのように書き換え、ソースファイルでの使用に際し可読性と互換性をトレードオフします。
- 孤立サロゲート:高位サロゲート(U+D800..U+DBFF)の後に低位サロゲートが続かない場合、RFC 8259上は有効なJSONですが、厳密モードやTypeScriptのJSON.parseでは拒否されます。ページは孤立サロゲートを\uFFFDに置き換え、厳密なパーサーでもラウンドトリップできるようにします。
- JSON.parseは厳密です:先頭のゼロ(01)はパースエラー、NaN/Infinityは有効なリテラルではありません、末尾カンマは許可されません。V8のJSON.stringifyは最小限のエスケープを常に生成し、スラッシュ/とU+2028/U+2029は可読性のために生のまま残します。
- JSON-in-JS:JSON文字列をJS文字列リテラルに埋め込むには、バックスラッシュを二重にする必要があります。ページの「JS文字列」出力はこの層を追加し、結果へのevalはJSON.parseと同じ文字列を返します。
- JSON5スーパーセット:シングルクォート文字列、複数行文字列、クォートなしキー、末尾カンマ、NaN/Infinity、単行コメント//。本ページは厳密なRFC 8259 JSONを生成し、JSON5ではありません。
使用例
ダブルクォートとバックスラッシュを含む文字列
入力: He said "Hello\World"
出力: He said \"Hello\\World\"改行とタブを含む文字列
入力: Line1\tIndent\nLine2
出力: Line1\tIndent\nLine2中国語とダブルクォートを含む文字列
入力: {"name": "Alice", "msg": "He said \"Hi\""}
出力: {\"name\": \"Alice\", \"msg\": \"He said \\\"Hi\\\"\"}よくある質問
JSON 文字列をエスケープすると何が行われますか?
入力をクォートで囲み、各特殊文字を JSON で安全なエスケープシーケンスに置換します。" → \"、\ → \\、改行 → \n、タブ → \t、制御文字 → \u00NN。結果は有効な JSON 文字列リテラルとなり、別の JSON ドキュメントやコードエディタに貼り付けることができます。
どのような場合に必要ですか?
よくあるケースは、複数行のメッセージを JSON 設定ファイルに埋め込む、JSON 文字列をコマンドライン引数として渡す、JSON の中に JSON を入れる (例えば本体自体が JSON エンコードされた文字列である API リクエストボディ)、ログ記録前のユーザー入力のサニタイズなどです。
エスケープと URL エンコードは同じですか?
いいえ。JSON エスケープは \n、\"、\u00XX を使用します。URL エンコードは %20、%22、%0A を使用します。構文上のコンテキストが異なれば、エスケープルールも異なります。出力先のフォーマットに合うほうを使ってください。
アンエスケープモードはあらゆる JSON エスケープに対応していますか?
はい。標準のエスケープすべて (\"、\\、\/、\b、\f、\n、\r、\t、\uXXXX) に対応しています。U+FFFF を超えるコードポイントのサロゲートペア (\uD83D\uDE00 = 😀) は実際の絵文字に再構成されます。不正なエスケープシーケンスがあれば、修正できるようエラーが表示されます。
文字列のエスケープとオブジェクトの文字列化の違いは何ですか?
エスケープはテキストをクォートされた JSON 文字列に変換します。文字列化 (JSON.stringify) は JavaScript オブジェクトを完全な JSON ドキュメントに変換します。このページは前者を行います。後者には、コードエディタでオブジェクトを JSON として記述するか、JSON フォーマッタを使用してください。
制御文字は常にエスケープされますか?
はい。JSON では必須です。改行、タブ、NULL、その他の ASCII 制御文字 (0x00-0x1F) はエスケープしないと有効な JSON ではなくなります。実装によっては DEL (0x7F) や U+FFFF を超える文字もエスケープしますが、本ページは RFC 8259 に厳密に従います。
データはどこかに送信されますか?
いいえ。エスケープとアンエスケープはブラウザ内で実行されます。貼り付けたテキストはアップロードされません。