このツールを構築させたバグが めちゃくちゃ小さかったのです HTMLメールテンプレートを詰め込んでいたのです 引用符や改行 奇数バックスラッシュを入れた数百行を JSONフィールドに詰め込んで APIに送信していたところ 要求は400 として何度も返ってきました テンプレートは問題ありませんでした JSONは単独でも問題ありませんでした しかし2人が会った瞬間 逃げられない二重引用符300 文字が 静かに文字列を早く閉じ 構文解析器が意味不明のゴミに変わった後は 全て有効なテキストを有効なコンテナに貼り付け 無効な文書を作っていました。
それがJSONエスケープが解決する問題全体であり、回避するよりも理解する価値があります。 このガイドでは、エスケープが実際に何を行うのか、どのキャラクターとその理由、エスケープ解除がどのように逆転するのか、フリーの使用方法について説明します JSON エスケープ / アンスケープ サイレント障害を 1 つも発生させることなく、任意のテキストを JSON 文字列に出入りするツールです。 に書いた他のデータ ユーティリティと並んでいます JSON ツールの究極のガイド。
tl;dr: JSON 文字列には、生の二重引用符、生のバックスラッシュ、または改行やタブのような生の制御文字を含めることはできません。 「エスケープ」は、それぞれをバックスラッシュシーケンス - に置き換えます
"なる\"、改行 なる\n、 タブ なる\t、そしてU+0020 より下の他のものは となる\uXXXX。 unescaping はそれらのシーケンスを元の文字に戻します。 the JSON エスケープ / アンスケープ ツールはブラウザーで両方を実行し、結果を引用符で囲むオプションを使用して、非 ASCII を次のようにエスケープします\uXXXX、または前方スラッシュをエスケープします。
JSON の文字列をエスケープするという意味は何ですか?
JSON には、公開された正確な文法があり、次のように定義されています RFC 8259 そしてECMA-404 規格によって - そして文字列の中に現れるかもしれないものの規則は厳格です JSON文字列は二重引用符で包まれた文字の連続です 二重引用符は文字列の開始と終了を示すので 二重引用符 中に テキストが途中で終了してしまうのです。バックスラッシュがエスケープ シーケンスを開始するため、生のバックスラッシュは 1 つの先頭として読み間違えられます。また、JSON 文字列はテキストの単一の論理行であることを意図しているため、リテラル制御文字 (改行、タブ、キャリッジ リターン) はエスケープせずに文字列内に配置することはできません。
エスケープとは、それらの厄介な文字をそれぞれJSONが理解できる2 文字のバックスラッシュシーケンスに置き換える処理です。 という二重引用符になります \"。 バックスラッシュ なる \\。 改行 なる \n。 結果はテキスト that 見ている 少し醜いが、周囲の文書を壊すことなく2 つの引用符の間にドロップするのが安全になった 意味は同じです - JSONパーサーの読み取り \n 再び実際の改行が作成されますが、この表現は現在合法です。
これは JSON ドキュメントをフォーマットするのとは根本的に異なります。 formatter はオブジェクト全体の構造、つまりインデント、キーの順序、要素間の空白を配置します。 escaping は 1 レベルダウンで、上で動作します 単一の文字列値の内容。 に手を伸ばす JSON フォーマッタ プリティプリントまたは検証するドキュメント全体がある場合 JSON エスケープ / アンスケープ 生のテキストが大量にある場合は、1 つのフィールドに収まる必要があります。
実際にエスケープが必要なキャラクターはどれですか?
JSONの仕様はここではさわやかに具体的です 文字列の中、ちょうど2 文字です しなければな 常にエスケープされ、さらに制御キャラクターの全範囲がエスケープされます。
2 つの必須の 1 文字エスケープは二重引用符です ()\")とバックスラッシュ()\\).それらを超えて、JSONは5 つの共通制御文字の短いエスケープを定義する: backspace (backspace) ()\b)、フォームフィード()\f)、改行()\n)、馬車返却()\r)、および水平タブ()\t). どれでも ほかの 制御文字 - U+0020 より下にコード ポイントがあり、短い形式がないもの - は、a として記述する必要があります \u エスケープの後に 4 つの 16 進数が続くため、ヌル バイトになります \u0000 そして "unit separator" になります \u001F。
あと2 人のキャラクターです オプション 逃げるために、そしてこれは混乱が忍び寄る場所です 前方スラッシュは次のように書くことができます \/、しかし、それはである必要はありません - 平野 / は完全に有効な JSON です。そして、アクセント付きのような ASCII 範囲より上の任意の文字 é または、絵文字は文字通り UTF-8 ドキュメントに書かれることも、次のようにエスケープされることもあります \uXXXX; どちらも合法です。 the JSON エスケープ / アンスケープ ツールは常に必須のエスケープを処理し、2 つのオプションのエスケープの切り替えを提供して、ターゲット システムが期待するものに一致させることができます。
前方スラッシュ文字と非ASCII文字をエスケープする必要がありますか?
これら 2 つのオプションのエスケープは、たとえ必要になることがほとんどなくても、実際の理由で存在します。
フォワード スラッシュ エスケープは、JSON が HTML 内に埋め込まれている場合という、まさに 1 つの一般的な状況で重要です <script> タグ。 browser' s HTMLパーサーはリテラルシーケンスを探します </ スクリプト ブロックの終わりを見つけるには、文字列が含まれます </script> JSON では、タグを途中で閉じてページを壊す可能性があります。 としてスラッシュを書き込みます <\/script> - まだ有効な JSON、一度解析しても同じ文字列 - それを回避します。インライン スクリプト以外では、スラッシュを放置できます。そのため、ツールはデフォルトで前方スラッシュをエスケープせずに放置します。
非 ASCII 文字をエスケープします \uXXXX 正確さよりも移植性のことです。 JSON が UTF-8 バイトをマングルするシステム (古いロギング パイプライン、構成ミスのプロキシ、ASCII を想定するチャネル) を通過する可能性がある場合、ASCII 範囲より上のすべての文字が純粋な ASCII に変わります \u エスケープは、それが無傷で生き残ることを保証します 出力はかさばり、人間が読めないので、デフォルトではオフですが、 " エスケープUnicode" トグルは、防弾輸送が必要な瞬間のようなコードポイントです é なる \u00e9と、JSON パーサーは途中で元の文字を再構築します。
脱出解除はどのように機能しますか?また、いつ必要ですか?
エスケープ解除はまさに逆です。エスケープされた文字列を歩き、各バックスラッシュ シーケンスをそれが表す生の文字に戻します。 \n 本物の改行になります、 \t タブになります、 \" 二重引用符になり、そして \uXXXX はそのコードポイントで文字になります。受信側にいるときはいつでも必要です。JSON ファイル、ログ行、または API レスポンスから直接文字列値をコピーしており、画面いっぱいのバックスラッシュなしで元のテキストを読みたいと考えています。方法。
優れた脱進機は、単純な発見と置換ではできない 2 つのことを行います。まず、値全体が引用されている場合、周囲の 1 組のダブルクォーテーションを削除するため、貼り付けることができます "line one\nline two" JSONドキュメントから直接クリーンテキストを返します.2 つ目は,それ 検証 進むにつれて: のような無効なエスケープ シーケンス \x、または文字列の最後尾にある迷走バックスラッシュは、実際のエラーであり、 JSON エスケープ / アンスケープ ツールは、推測して静かに間違った出力を生成するのではなく、その位置を報告します。 " 位置 14" で無効なエスケープを取得すると、ほぼ正しく見えるが微妙に破損しているテキストを取得できるようになります。
信頼すべき重要な特性は、エスケープとエスケープの解除は正確な逆数であるということです。任意のテキストをエスケープしてから結果をエスケープ解除すると、文字ごとに、最初に始めたものを正確に戻すことができます。この往復保証により、手動で再確認する必要がある危険な変換ではなく、パイプラインのルーチン ステップとしてツールを安全に使用できるようになります。
エスケープ操作と関連する文字列操作
JSON エスケープは、" のファミリーの 1 つです。このテキストをそのコンテキストに対して安全にします。変換し、それらをまっすぐに保つのに役立ちます。これは、近隣の開発者と比較して、最も頻繁に混同される方法です。
| 操作 | 防ぐ | 例 | ツール |
|---|---|---|---|
| JSON エスケープ | JSON 文字列を引用符、バックスラッシュ、またはコントロール文字で破る | he said "hi" → he said \"hi\" |
JSON エスケープ / アンスケープ |
| HTML エンティティエンコード | HTML を壊したり、XSS を有効にしたりします <、 >、 & |
<b> → <b> |
HTML エンティティ |
| URLパーセントエンコード | スペースまたは予約文字を使用して URL を破ります | a b → a%20b |
ー |
| JSON フォーマット/検証 | 文書全体にわたる構造上のエラー | ミニ化 → pretty-printed | JSON フォーマッタ |
| JSON → YAML | シリアル化フォーマット間のコンフィグの移動 | {"a":1} → a: 1 |
JSON から YAML へ |
気づくべきパターンは、各エスケープが a をターゲットにしていることです ちがう コンテナ. HTML エンティティはテキストが HTML を壊さないようにする; percent-encoding は URL を壊さないようにする; JSON エスケープは JSON 文字列を壊さないようにする 間違ったものを使う - HTML-encoding は JSON エスケープが必要なもの - は本当の問題を解決せず、新しいノイズ層を追加する これはすべてサードパーティのサーバーに渡したくないかもしれないテキストで実行されるので、私はこれらのツールのすべてをクライアント側に保持します、これは私が完全に行った引数です オンラインツール向けデータプライバシーガイド。
JSONにテキストを埋め込むときによくある間違いは何ですか?
最も一般的な間違いは、午後に費用がかかったものです。エスケープされていない引用符を含む複数行のテキストを JSON フィールドに直接貼り付け、両方の部分が有効であるため全体が有効であると仮定した場合ではありません。コンテナには、コンテンツが従わなければならないルールがあります。
近い秒は 二重脱出.文字列が既に一度エスケープされ、再度エスケープした場合は、every \n なる \\n そして改行は リテラルのバックスラッシュ-nに変わります パーサーが変換し直すことはありません これは通常 値が2 つのシステムを通過するときに起こります それぞれがそれを助けにエスケープします 出力に疑わしい実行がある場合 \\ 単一のバックスラッシュを期待していたところ、おそらく二重のエスケープがあり、一度エスケープを解除すると修正されます。 3 番目のトラップは、Windows パスが次のようなものであることを忘れています C:\Users\me はバックスラッシュでいっぱいで、それぞれが になる必要があります \\ - JSON のエスケープされていないパスは、" の古典的なソースです。なぜ私の JSON は無効なのですか。引用;混乱。
3 つすべての修正は同じです: ツールにエスケープを一度だけ実行させ、生のテキストがJSONと出会う境界で、それが示す文字数の要約を読んで、何かが変わったことを正気で確認し、手作業で検証する必要があるときは、 " でエスケープします quotes" でラップします 有効にして、結果をに貼り付けます JSON フォーマッタ - 有効な文字列として解析される場合、エスケープは正しいです。
うまくいった例: JSON に HTML スニペットを埋め込む
一度変換を見るとルールが固執するため、これを始めた正確な状況を説明しましょう。このフラグメントを として送信したいとします body APIリクエストのフィールド:
<p>Hi "there",</p>
<p>Visit https://example.com/path</p>
そのテキスト内の 3 つのことが JSON と競合します。 2 つの二重引用符が囲んでいます there それぞれ文字列を終了しようとしますか 段落間の改行は 文字列の中で JSON が禁止するリテラル制御文字です そして、 </p> シーケンスはプレーンな JSON ファイルでは無害ですが、この JSON が HTML 内に印刷されると危険です <script> タグ。 にフラグメントを貼り付けます JSON エスケープ / アンスケープ ツール、オンにします " 引用符で包みます, " そして、あなたは単一の、有効なJSON文字列を取得します: 引用符はになります \"、改行 は なる \n、および " escape forward slash" で終了タグを有効にしました <\/p>。その引用された値全体をそのままドロップします body フィールドとリクエストが実行されます。
逆行も同様にルーチンです。チームメイトが JSON エスケープされたログ ラインを送信すると message フィールドがいっぱい \n あんど \"、ツールに貼り付け、unescapeに切り替え、バックスラッシュがなくなった元の複数行のテキストを読みます。 2 つの操作は正確な逆であるため、ペイロードを移動して編集し、破損を恐れることなく元に戻すことができます - 文字数の概要は変換が実行されたことを確認し、不正なエスケープにはテキストを静かにめくるのではなく、その位置でフラグが立てられます。その往復の安全性は、神経質な手動ステップからのエスケープを、ワークフローに配線して忘れることができるものに変えるものです。
よくある質問
JSON の文字列をエスケープするという意味は何ですか? JSON 文字列の値には、生の二重引用符、生のバックスラッシュ、または改行やタブなどの生の制御文字を含めることはできません。エスケープすると、これらのそれぞれがバックスラッシュ シーケンス - " に置き換えられます。 " になり、改行は\n になり、タブは\t になります。そのため、周囲の構造を壊すことなく、テキストを JSON 文字列内に配置できます。
これは JSON フォーマッタとどう違うのですか? JSON フォーマッタは、JSON ドキュメント全体をかなり印刷または縮小してその構造を検証します。 このツールは、1 つの文字列の内容に対して、1 レベル下で動作します。任意のテキストを JSON 値に埋め込むか、またはエスケープされた値を生のテキストに戻します。 ドキュメントにはフォーマッタを使用し、個々の文字列にはこのツールを使用します。
どの文字がエスケープされますか? ダブル クォート (")、バックスラッシュ (\)、バックスペース (\b)、フォーム フィード (\f)、改行 (\n)、キャリッジ リターン (\r)、およびタブ (\t) は常にエスケープされます。 U+0020 以下の他の制御文字は \uXXXX として表示されます。オプションで、前方スラッシュは / になり、ASCII 以外の文字はすべて \uXXXX になります。
フォワードスラッシュからエスケープする必要がありますか? オプションです。 JSON 仕様では / と / の両方が許されているので、 plain / は有効です。 / の 1 つの場所は HTML の中にあります



