ToolDeck

JSON String Escape

JSON 文字列内の特殊文字をエスケープ・アンエスケープ

サンプルを試す

入力

出力

ローカルで実行 · シークレットの貼り付けも安全
結果がここに表示されます…

JSON 文字列エスケープとは?

JSON 文字列エスケープとは、文字列内の特殊文字を、JSON パーサーが構造を壊さずに読み取れるエスケープシーケンスに変換する処理です。JSON 仕様(ECMA-404 / RFC 8259)では、文字列値の中に含まれる特定の文字の前にバックスラッシュを付けることが義務付けられています。適切なエスケープが行われていない場合、文字列内のリテラルのダブルクォートや改行は文字列を途中で終端させてしまい、パースエラーを引き起こします。

すべての JSON 文字列はダブルクォートで区切られます。文字列自体にダブルクォート、バックスラッシュ、または制御文字(U+0000 〜 U+001F)が含まれている場合、その文字をエスケープシーケンスで置き換える必要があります。たとえば、リテラルの改行は \n に、タブは \t に、ダブルクォートは \" になります。また、任意の Unicode コードポイントを \uXXXX 形式(XXXX は4桁の16進数値)で表現することもできます。

アンエスケープ(逆の操作)は、バックスラッシュシーケンスを元の文字に戻します。文字列値が二重エスケープされた JSON ペイロードを受信した場合や、JSON ログエントリから UI やターミナルに表示するために生のテキストを取り出す必要がある場合に使用します。ログ集約パイプラインではこの問題が頻繁に発生します。JSON エンコードされたメッセージが別の JSON ドキュメントの文字列値として格納されると、内側の文字列のバックスラッシュがすべて二重になって届くためです。

JSON エスケープツールを使う理由

バックスラッシュを手動で追加・削除するのは面倒でミスが起きやすく、特に複数行のテキスト、ファイルパス、埋め込みコードスニペットを扱う場合はなおさらです。専用のエスケープツールを使えば、手作業では見落としがちなエッジケースも確実に処理できます。

🔒
プライバシー優先の処理
入力した文字列はブラウザの外に送信されません。エスケープ・アンエスケープの処理はすべて JavaScript によりローカルで実行されるため、API キーやトークンなどの機密データがサーバーに送られることはありません。
即時変換
テキストを貼り付けるだけで、正しくエスケープされた JSON 出力がミリ秒以内に得られます。リモートサーバーへの往復を待つ必要はありません。
🛡️
アカウント・インストール不要
ページを開いてすぐにエスケープを開始できます。サインアップフォーム、ブラウザー拡張機能、CLI ツールのインストールは一切不要です。最新ブラウザーが動作するデバイスならどこでも使えます。
📋
完全な文字対応
JSON が要求するすべてのエスケープに対応しています:ダブルクォート、バックスラッシュ、制御文字(U+0000 〜 U+001F)、および絵文字や CJK 文字を含む Unicode シーケンス。

JSON 文字列エスケープの主なユースケース

フロントエンド開発
fetch や XMLHttpRequest で送信する JSON ペイロードに埋め込む前に、ユーザー生成コンテンツをエスケープします。ユーザーがクォート、改行、絵文字を入力した際のリクエスト不正を防ぎます。
バックエンド API 開発
文字列を自動エスケープしない言語(シェルスクリプト、SQL ストアドプロシージャ、テンプレートエンジン)で JSON レスポンスボディを構築する際に使用します。生の文字列を貼り付け、エスケープ済みのバージョンをコピーするだけです。
DevOps と設定管理
複数行の証明書 PEM ブロック、SSH キー、またはシェルスクリプトを、Terraform・CloudFormation・Kubernetes ConfigMap 用の JSON 設定ファイルに JSON 構造を壊さず埋め込みます。
QA とテスト
タブ、ヌルバイト、Unicode サロゲートペア、ネストされたエスケープ文字列など、エッジケースとなる文字を含むテストフィクスチャを作成します。パーサーがそれらを正しく処理することを検証できます。
データエンジニアリング
Elasticsearch、CloudWatch、Datadog からの二重エスケープされたログエントリを整理します。文字列をアンエスケープして元のメッセージを復元し、分析や再取り込みに活用します。
JSON の学習
JSON 仕様に従ってどの文字がエスケープを必要とするかを実際に確認できます。ECMA-404 を学んでいる方や、独自の JSON パーサーを構築している方に役立ちます。

JSON エスケープシーケンスリファレンス

JSON 仕様では、必須エスケープとして正確に2種類(ダブルクォートとバックスラッシュ)と、よく使われる制御文字向けの6種類の短いエスケープシーケンスが定義されています。その他の制御文字(U+0000 〜 U+001F)はすべて \uXXXX 形式を使用する必要があります。U+FFFF を超える文字(絵文字など)は UTF-16 サロゲートペアで表現できます:\uD83D\uDE00。

文字説明エスケープ形式
"Double quote\"
\Backslash\\
/Forward slash\/ (optional)
\nNewline (LF)\n
\rCarriage return\r
\tTab\t
\bBackspace\b
\fForm feed\f
U+0000–U+001FControl characters\u0000–\u001F
U+0080+Non-ASCII (e.g. emoji)\uXXXX or raw UTF-8

JSON エスケープ vs. JSON エンコーディング

文字列のエスケープと JSON ドキュメント全体のエンコードを混同する開発者が多くいます。

文字列エスケープ
JSON 文字列値の内部テキストに対して行う処理です。特殊文字をバックスラッシュシーケンスに置き換えることで、文字列がダブルクォート内で有効な状態を保ちます。入力:生のテキスト。出力:エスケープ済みテキスト(有効な JSON にするには引用符で囲む必要があります)。
JSON エンコーディング(シリアライズ)
オブジェクト、配列、数値、真偽値、null などのデータ構造全体を JSON テキスト表現に変換する処理です。文字列エスケープはこの大きなプロセスの一ステップです。入力:データ構造。出力:完全な JSON ドキュメント。

コード例

主要な言語にはこの処理の組み込み関数が用意されています。JavaScript、Python、Go、jq での例を示します:

JavaScript (browser / Node.js)
// JSON.stringify escapes a value and wraps it in quotes
JSON.stringify('Line 1\nLine 2')       // → '"Line 1\\nLine 2"'

// To get just the inner escaped string (no surrounding quotes):
const escaped = JSON.stringify('She said "hello"').slice(1, -1)
// → 'She said \\"hello\\"'

// Parsing reverses the escaping
JSON.parse('"tabs\\tand\\nnewlines"')  // → 'tabs\tand\nnewlines'

// Handling Unicode: emoji in JSON
JSON.stringify('Price: 5\u20ac')       // → '"Price: 5\u20ac"' (raw euro sign)
Python
import json

# json.dumps escapes and quotes a string
json.dumps('Line 1\nLine 2')           # → '"Line 1\\nLine 2"'

# Ensure ASCII: replace non-ASCII with \uXXXX sequences
json.dumps('Caf\u00e9', ensure_ascii=True)   # → '"Caf\\u00e9"'

# Keep UTF-8 characters as-is (default in Python 3)
json.dumps('Caf\u00e9', ensure_ascii=False)  # → '"Caf\u00e9"'

# Unescape by round-tripping through json.loads
json.loads('"She said \\"hello\\""')      # → 'She said "hello"'
Go
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// json.Marshal escapes a Go string for JSON
	raw := "Line 1\nLine 2\tindented"
	b, _ := json.Marshal(raw)
	fmt.Println(string(b))
	// → "Line 1\nLine 2\tindented"

	// Unescape with json.Unmarshal
	var out string
	json.Unmarshal([]byte(`"She said \"hello\""`), &out)
	fmt.Println(out)
	// → She said "hello"
}
CLI (jq)
# Escape a raw string into a JSON-safe value
echo 'Line 1
Line 2	with tab' | jq -Rs '.'
# → "Line 1\nLine 2\twith tab\n"

# Unescape a JSON string back to raw text
echo '"She said \"hello\""' | jq -r '.'
# → She said "hello"

よくある質問

JSON 文字列でエスケープが必要な文字はどれですか?
JSON 仕様(RFC 8259)では、ダブルクォート(\")、バックスラッシュ(\\)、および U+0000 〜 U+001F のすべての制御文字のエスケープが必須です。スラッシュ(/)は \/ としてエスケープできますが任意です。非 ASCII テキストや絵文字を含む他のすべての Unicode 文字は、ドキュメントが UTF-8 エンコーディングを使用している限り、エスケープなしで使用できます。
JSON エスケープと JSON stringify の違いは何ですか?
JavaScript の JSON.stringify() は、JavaScript の値全体を JSON 文字列にシリアライズし、外側のダブルクォートを付加して内部の特殊文字をエスケープします。JSON エスケープとは、特殊文字をバックスラッシュシーケンスで置き換えるという文字レベルの処理を指します。文字列に対して JSON.stringify() を呼び出すと、シリアライズ処理の一部としてエスケープが実行されます。
JSON で改行をエスケープするにはどうすればよいですか?
リテラルの改行文字(U+000A)を2文字のシーケンス \n に置き換えます。同様に、キャリッジリターン(U+000D)は \r になります。Python の JSON.stringify() や json.dumps() を使用すれば、これらの置き換えは自動的に行われます。
JSON 文字列が二重エスケープされるのはなぜですか?
二重エスケープは、文字列が2回シリアライズされると発生します。たとえば、すでにエスケープシーケンスを含む文字列に対して JSON.stringify() を呼び出すと、バックスラッシュが再度エスケープされ、\n が \\n になります。修正するには、再シリアライズ前に JSON.parse() で文字列を一度パースするか、パイプラインに冗長なエンコードステップがないか確認してください。
JSON 文字列にシングルクォートは使えますか?
使えません。JSON 仕様では、すべての文字列値とプロパティ名にダブルクォートが必須です。シングルクォートは有効な JSON ではなく、パースエラーを引き起こします。元のデータにシングルクォートが含まれている場合でも、JSON のダブルクォート内ではシングルクォートは通常の文字として扱われるためエスケープは不要です。
JSON にエスケープなしの UTF-8 文字を含めることは安全ですか?
はい。RFC 8259 がデフォルトかつ推奨のエンコーディングとして規定している UTF-8 で JSON ドキュメントがエンコードされていれば、アクセント付き文字、CJK 文字、絵文字を \uXXXX エスケープなしで直接文字列に含めることができます。一部の古いシステムでは ASCII のみの JSON が必要とされる場合があります。その場合は、Python の ensure_ascii オプションや、お使いの言語の同等フラグを使用してください。
JSON で絵文字をエスケープするにはどうすればよいですか?
U+FFFF を超える絵文字は、JSON では UTF-16 サロゲートペアで表現されます。たとえば、にっこり顔(U+1F600)は \uD83D\uDE00 になります。ほとんどのシリアライザーはこれを自動的に処理します。JSON を手書きする場合や、ツールが基本多言語面のみをサポートしている場合はサロゲートペア表記を使用してください。それ以外の場合は、UTF-8 文字として絵文字をそのまま含めることができます。