JSONのエスケープ/アンエスケープ

安全なJSON埋め込み用に文字列の特殊文字をエスケープするか、JSON文字列をプレーンテキストにアンエスケープします。

仕組み

  1. 文字列を貼り付け: エスケープするテキストを入力します, 引用符、改行、バックスラッシュ、その他の特殊文字を含むプレーンテキストです。
  2. エスケープまたはアンエスケープを選択: JSONに埋め込むためにテキストをエスケープするか、JSON文字列を読み取り可能なテキストにアンエスケープするかを選択します。
  3. 結果をコピー: エスケープまたはアンエスケープされた出力が瞬時に表示されます。コードまたはデータで使用するためにコピーします。

なぜJSONエスケープを使うのか?

JSON文字列には厳しいエスケープルールがあります, 二重引用符は\"、改行は\n、バックスラッシュは\\、タブは\tになる必要があります。これらの文字を正しくエスケープしないと、API、設定ファイル、データパイプラインを壊すJSON解析エラーが発生します。このツールはすべてのエスケープとアンエスケープを自動的に処理し、手動の検索置換を排除し、エスケープシーケンスの見落としによる微妙なバグを回避します。

機能

よくある質問

JSONエスケープが処理する文字は?

JSONはエスケープを必要とします: 二重引用符(")、バックスラッシュ(\)、スラッシュ(/)、改行(\n)、キャリッジリターン(\r)、タブ(\t)、フォームフィード(\f)、バックスペース(\b)、U+FFFFを超えるUnicode文字。このツールはすべてを処理します。

なぜJSON解析エラーがエスケープに関連しているのですか?

一般的な原因には、文字列値内のエスケープされていない二重引用符、文字列内のリテラル改行(\nである必要がある)、エスケープされていないバックスラッシュが含まれます。壊れた文字列をここに貼り付けて適切にエスケープしてください。

周囲の引用符は含まれますか?

デフォルトでは、ツールは囲み引用符なしでコンテンツをエスケープし、結果をJSON文字列に貼り付けることができます。出力を二重引用符で囲みたい場合は、「引用符を含める」オプションを有効にします。

JSON 文字列仕様を 1 つの表で

RFC 8259(2017 年 12 月、Tim Bray による)は現在の JSON 標準であり、RFC 7159 と元の RFC 4627 を置き換えています。仕様のセクション 7 は、文字列リテラル内でエスケープする必要がある文字を正確にリストアップしています:

文字 エスケープ コードポイント 意味
"\"U+0022引用符(文字列を終了)
\\\U+005Cバックスラッシュ(エスケープを開始)
\b\bU+0008バックスペース
\f\fU+000Cフォームフィード
\n\nU+000A改行(LF)
\r\rU+000D復帰(CR)
\t\tU+0009タブ
/\/U+002Fスラッシュ(オプションだが、HTML 埋め込みに便利)
control\uXXXXU+0000-U+001F上記でカバーされていない C0 制御文字

同等の規則は ECMA-404(第 2 版、2017 年 12 月)にあり、IETF 仕様と同期して保持されています。JSON には 8 進数(\012)や 16 進数(\x41)のエスケープはありません、それらは JavaScript のみ;JSON は上記の 8 つの名前付きエスケープと \uXXXX のみをサポートします。

\uXXXX エスケープとサロゲートペアの罠

JSON の \uXXXX シーケンスは UTF-16 コードユニットをエンコードします、Unicode コードポイントではありません。これは絵文字と補助プレーン文字にとって重要です。😀(U+1F600)のような単一の絵文字は \u1F600(これは合法な 4 桁 16 進数の形式でさえありません)ではなく、サロゲートペアとしてエスケープされます:\uD83D\uDE00、高位と低位のサロゲートをエンコードする 2 つの連続したエスケープ。高サロゲートの範囲は U+D800–U+DBFF;低サロゲートの範囲は U+DC00–U+DFFF;一緒に U+10000 から U+10FFFF(補助プレーン)をカバーします。

これはエスケープされた絵文字バグの最も一般的な原因です。RFC 8259 セクション 7 は明示的に述べています:「基本多言語面にない拡張文字をエスケープするには、文字は UTF-16 サロゲートペアをエンコードする 12 文字のシーケンスとして表されます。」👨‍👩‍👧‍👦 のような家族 4 人の絵文字は、技術的には 4 つの基本絵文字と 3 つのゼロ幅結合子で、JSON 文字列で 30+ 文字としてエスケープされます。バイト数はそれに応じて膨らみます:生の UTF-8 25 バイト、JSON エスケープ後 ~58 バイト。

HTML、URL、SQL、CSV 内の JSON

JSON エスケープだけでは、JSON が別の形式に埋め込まれている場合には不十分です。各コンテキストは独自のレイヤーを追加します。

HTML 内の JSON。古典的な罠は、ペイロードに </script> という文字列リテラルが含まれているときの <script>const data = {{ payload | json }};</script> です。HTML パーサーは文字列の途中でスクリプトタグを閉じ、JSON の残りはページ上に可視テキストとしてレンダリングされます。修正はオプションの \/ エスケープです:<\/script> は JSON 有効かつ HTML 安全です。OWASP のクロスサイトスクリプティングのチートシートは、HTML 埋め込み用の JSON で常に <>&' をエスケープすることを推奨しています。

URL クエリ文字列内の JSON。2 つのレイヤー:まず JSON エスケープ、次にパーセントエンコーディング。{"name":"Bob"}%7B%22name%22%3A%22Bob%22%7D になります。パーセントエンコーディングを忘れることが、不正な JSON-in-URL バグの第 1 位の原因です。

SQL 内の JSON。PostgreSQL jsonb カラムに保存された値はネイティブで解析され、それ以上のエスケープは不要です。しかし SQL 文字列リテラルに埋め込まれた JSON(INSERT INTO t (data) VALUES ('{"key":"value"}'))は JSON に加えて SQL 文字列エスケープが必要です:シングルクォートを 2 つにする('')、またはより良いのは、パラメータ化クエリを使う。

CSV セル内の JSON。CSV のクォートは JSON とは異なります(CSV は二重化されたクォート "" を使い、バックスラッシュシーケンスではありません)。CSV セルに JSON を埋め込むには両方のレイヤーが必要:文字列を JSON エスケープし、結果を CSV エスケープする("..." で囲み、内部の任意の " を 2 倍にする)。

言語をまたがるランタイム API

言語 エンコード デコード 備考
JavaScriptJSON.stringifyJSON.parseIE 8(2009)からネイティブ。すべてのブラウザと Node で利用可能。
Pythonjson.dumpsjson.loadsensure_ascii=False は非 ASCII の \uXXXX エスケープを放棄します。
PHPjson_encodejson_decodePHP 5.2(2006 年 11 月)からネイティブ。フラグ JSON_UNESCAPED_UNICODE は 5.4 から。
JavaObjectMapper.writeValueAsStringreadTreeJackson は ~2009 から事実上の標準。
Gojson.Marshaljson.Unmarshal標準ライブラリ encoding/json
Rustserde_json::to_stringserde_json::from_strserde_json クレート、遍在的。

JSON の出自と、Crockford が省いたもの

JSON は最初、Douglas Crockford によって 2001 年に State Software で形式化されました、もともと非同期データ交換のために JavaScript オブジェクトをシリアライズするためでした。最初の公開言及は 2003 年の JSON.org サイトでした。Crockford は 2006 年 7 月に RFC 4627 として正式に指定しました、部分的には同時期に競合する特許試みに対抗するためでした。標準は 2017 年 12 月の RFC 8259 で STD 90 ステータスに移行しました。

JSON の最大の設計決定は、JavaScript のサブセットにすることでした、つまり任意の JSON ドキュメントは JS インタプリタで eval'd でき、正しい値を生み出します。これによりブラウザでの採用は摩擦なく進みましたが、いくつかの JS の癖を永続的に固定しました:整数型なし(すべての数値は IEEE 754 double)、日付型なし、NaN や Infinity なし。2⁵³−1 を超える大きな整数は、サイレント精度損失を避けるために文字列シリアライズ("id": "9007199254740993")が必要です。

Crockford は意図的に、あなたが恋しく思うかもしれないものを省略しました:コメント(「JSON からコメントを削除しました、なぜなら人々がそれを使ってパースディレクティブを保持しているのを見たからです、これは相互運用性を破壊する可能性がありました」、2012 年 5 月)、末尾のカンマ、およびスキーマ言語(後で JSON Schema として追加され、別々に維持され、現在のドラフト 2020-12)。コミュニティバリアントの JSON5 はコメントと末尾のカンマを復元しますが、RFC 準拠ではありません;主に人間が編集する設定ファイル(.babelrc.swcrc)で使用されます。

一般的なユースケース

よくある間違い

  1. JSON 有効でない JavaScript エスケープを使う。「A」のための \x41 と改行のための \012 は JS 文字列リテラルでは有効ですが JSON では無効です。JSON は 8 つの名前付きエスケープと \uXXXX のみを許可します。
  2. JSON 文字列にシングルクォートを使う。'hello' は JavaScript で動作しますが JSON 無効です。JSON 文字列はダブルクォートを使う必要があります。
  3. クォートなしのオブジェクトキー。{name: "Bob"} は JavaScript で動作しますが JSON 無効です。キーはダブルクォート内の文字列リテラルである必要があります。
  4. 末尾のカンマ。[1,2,3,] は JS で動作しますが JSON 無効です。RFC 8259 はそれらを明示的に禁止しています。
  5. インラインコメント。// foo/* foo */ は標準 JSON で無効です。コメントが必要な場合は JSON5 を使う;すべてのパーサーが受け入れるとは期待しない。
  6. 単一の \uXXXX として絵文字を手動でエスケープする。U+FFFF を超える絵文字は UTF-16 サロゲートペア、連続した 2 つの \uXXXX エスケープが必要です。

その他のよくある質問

常にフォワードスラッシュ / をエスケープすべきですか?

いいえ、フォワードスラッシュ / は JSON でエスケープなしで許可されています;エスケープ \/ はオプションです。例外は JSON が HTML <script> タグ内に埋め込まれている場合:/\/ としてエスケープすると、リテラル部分文字列 </script> がタグを早期に閉じることを防ぎます。一部のエンコーダ(PHP の JSON_HEX_TAG、カスタム JS 置換)はこれを行います;ほとんどは行いません。

JSON.stringify が私の非 ASCII 文字をエスケープするのはなぜですか?

デフォルトではしません。JavaScript の JSON.stringify("café") はリテラル é を持つ "café" を生成します。あなたが見ているのは別のライブラリかもしれません:Python の json.dumps はデフォルトで ensure_ascii=True で、ASCII 外のすべてを \uXXXX としてエスケープします;PHP の json_encodeJSON_UNESCAPED_UNICODE を渡さない限り同様に動作します。両方の動作は有効な JSON ですが、ファイルサイズと可読性が異なります。

JSON はバイナリデータを保存できますか?

直接はできません。JSON 文字列は Unicode 文字のシーケンスで、バイトではありません。標準的な回避策はバイナリを最初に Base64 エンコードし、結果の ASCII 文字列を通常の JSON 値として保存することです。エンコードされたデータは生のバイトより ~33% 大きくなります。非常に大きなバイナリの場合は BSON、MessagePack、CBOR などのバイナリ形式を使う、またはバイトを別途保存して URL で参照します。

なぜ一部のツールは é の代わりに \u00e9 を表示するのですか?

両方とも同じ文字に対する有効な JSON です。"caf\u00e9""café" は同じ文字列にデコードされます。一部のエンコーダは最大のクロスエンコーディングの安全性のために非 ASCII をエスケープします(出力は純粋な ASCII なので消費者のエンコーディングは関係ありません)、他は可読性のために元の UTF-8 を保持します。JSON を消費するものに基づいて選択してください。

私のテキストはどこかにアップロードされますか?

いいえ。このツールはブラウザのネイティブ JSON.stringifyJSON.parse API を完全にクライアントサイドで使います。ネットワークコール、アナリティクス、ロギングはありません。API トークン、内部データ、またはサーバーサイドのエスケープツールに貼り付けたくないものをエスケープするのに安全です。

関連ツール

無料の JSON フォーマッタ&バリデータ・オンライン JSONツリービューア JSONパス抽出 HTMLエンティティ エンコーダー/デコーダー