JSONエスケープ
任意のテキストを、JSONの中に安全に埋め込める文字列に変換します。
テキスト
エスケープ後
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
任意のテキストを、JSON文字列の中に安全に置ける形に変換します。引用符、バックスラッシュ、改行、タブ、制御文字はエスケープし、それ以外はそのまま残します。
ペイロード、ログの1行、SQLクエリ、HTMLの断片などを手作業でJSONのフィールドに埋め込むときに必要になる操作です。
エスケープが必要なものと不要なもの
JSONはエスケープシーケンスをちょうど9種類定義しており、エスケープが必須なのはちょうど3つの場面です。
- ダブルクォート
- \"になります。そのままでは文字列がそこで終わってしまいます。
- バックスラッシュ
- \\になります。そのままではエスケープの開始になってしまいます。
- 制御文字(U+0000〜U+001F)
- 改行は\n、タブは\t、復帰は\r、バックスペースは\b、フォームフィードは\fになります。この範囲のそれ以外の文字は\uXXXX形式になります。
- スラッシュ
- \/としてエスケープできますが、必須ではありません。どちらの書き方も同じ文字を意味します。このエスケープがあるのは、HTMLのscript要素の中にJSONを埋め込めるようにするためです。そこでは</という並びが要素を終わらせてしまいます。
- 非ASCII文字
- エスケープはまったく不要です。JSONはUTF-8であり、é、你、🎉はいずれもそのまま書けます。ここでエスケープできるようにしてあるのは、非ASCIIを途中で壊してしまうシステム向けの選択肢です。
- シングルクォート
- 何もしなくて構いません。ダブルクォートで囲まれた文字列の中では普通の文字であり、\'はJSONの有効なエスケープではありません。
サロゲートと絵文字
基本多言語面の外にある文字は、絵文字を含めてすべてUTF-16の2つのコードユニットとして保持されます。エスケープすると\uシーケンスが2つになり、クラッカーの絵文字なら\ud83c\udf89です。これは正しい表現で、どのパーサーも元の文字を復元します。
対になっていない片方だけのサロゲートは、ほかを一切エスケープしない設定でも常にエスケープします。そのまま出力すると整形式でないUnicodeになり、UTF-8に再エンコードした時点で壊れるからです。
たいていの場合の、より良い答え
JSONを組み立てるために手でエスケープしているなら、そこでやめてシリアライズしてください。JSON.stringify、json.dumpsとその同等物は、仕組みとしてすべての値を正しくエスケープし、取りこぼすことがありません。
手作業で組み立てたJSONこそ、不正な制御文字と未終了の文字列に関するエラーのほぼすべての根本原因です。
How to do this in code
コードでのエスケープ。
js JavaScript
// Escaped and quoted
const quoted = JSON.stringify(text);
// Escaped without the surrounding quotes
const escaped = JSON.stringify(text).slice(1, -1); py Python
import json
quoted = json.dumps(text) # with quotes, non-ASCII escaped
quoted = json.dumps(text, ensure_ascii=False) # with quotes, é stays é
escaped = json.dumps(text)[1:-1] sh Shell
# jq's @json filter escapes and quotes
printf '%s' "$text" | jq -Rs @json
# -R reads raw input, -s slurps it into one string go Go
b, _ := json.Marshal(text) // includes the quotes
// Marshal escapes <, > and & by default for HTML safety.
// To turn that off you need an Encoder:
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
enc.Encode(text) よくある質問
- シングルクォートはエスケープが必要ですか?
- 必要ありません。ダブルクォートで囲まれたJSON文字列の中では、アポストロフィは普通の文字であり、\'はそもそもJSONの有効なエスケープではありません。JavaScriptとJSON5では有効で、その習慣がここに持ち込まれています。
- 非ASCII文字はエスケープすべきですか?
- ふつうは不要です。JSONはUTF-8であり、アクセント付き文字、CJK、絵文字はいずれもそのまま書けます。エスケープするのは、経路のどこかが非ASCIIを壊す場合だけにしてください。そしてそれは、経路のほうを直すべき理由です。
- Windowsのパスはどうなりますか?
- バックスラッシュはすべて2つになります。C:\\Users\\priyaのようにです。単一のバックスラッシュで終わるパスは、単に間違っているよりたちが悪く、閉じ引用符をエスケープしてドキュメントの残りを飲み込みます。