JSONアンエスケープ
エスケープされた文字列から、何重であっても読めるJSONを取り戻します。
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
エスケープされたJSON文字列から、元のテキストを取り戻します。前後の引用符があれば取り除き、エスケープシーケンスをデコードし、\uXXXXはそれが指す文字になります。
値が何重にエンコードされているかも数えます。JSON.stringifyが二重にかかったペイロードは、APIのバグとしてよくあり、しかも読めないからです。
二重エンコードと、その見分け方
シリアライズされ、テキストのフィールドに入れられ、もう一度シリアライズされた値は、バックスラッシュだらけの見た目で届きます。3回目のシリアライズでさらに倍になります。
このツールは層の数を検出し、すべて剥がすことを提案します。よくある原因は、ペイロードをテキストとして保存し、デコードしないままJSONの封筒に入れて返すサービスか、すでに文字列化されたものにさらにstringifyを呼ぶクライアントです。
推測せずに報告すること
不正なエスケープシーケンスは、黙って処理せず警告として扱います。\x41は妥当なJSONではなく、それを黙ってAに変えるツールは、ドキュメントが持っていない意味を捏造していることになります。位置と説明を提示し、テキストの残りが生き残るようにバックスラッシュだけを取り除きます。
デコード結果それ自体が妥当なJSONだった場合も報告します。剥がし終わったかどうかを最短で確認する方法です。
How to do this in code
コードでのアンエスケープ。
js JavaScript
// If the value includes its quotes, parse it as a JSON string
const text = JSON.parse('"line one\\nline two"');
// Peel every layer of encoding
function fullyDecode(value) {
let out = value;
for (let i = 0; i < 8 && typeof out === 'string'; i++) {
try { out = JSON.parse(out); } catch { break; }
}
return out;
} py Python
unicode_escapeは最初に見つかる答えですが、非ASCIIに対しては誤りです。
import json
text = json.loads('"line one\\nline two"')
# Standard library, without the surrounding quotes
text = bytes(raw, 'utf-8').decode('unicode_escape')
# Note: unicode_escape assumes Latin-1 for bytes above 127,
# so it mangles non-ASCII. json.loads is the correct route. sh jq
fromjsonは、まさに二重エンコードの場合のためにあるjqの組み込み関数です。
# Decode a JSON string to raw text
jq -r . <<< '"line one\nline two"'
# Peel a doubly encoded field
jq -r '.payload | fromjson' response.json よくある質問
- 出力にまだバックスラッシュが残っているのはなぜですか?
- 2回以上エンコードされていたからです。「すべての階層を解除」を有効にするか、カウントが0になるまで自分の出力に対してもう一度このツールを実行してください。
- 結果が妥当なJSONだったというのは何を意味しますか?
- その文字列が、平文ではなくJSONドキュメントを含んでいたということです。これが二重エンコードの状態であり、ツールはそのことを明示します。