本文へスキップ
jsonbeautifiers
日本語

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のようにです。単一のバックスラッシュで終わるパスは、単に間違っているよりたちが悪く、閉じ引用符をエスケープしてドキュメントの残りを飲み込みます。