JSON を文字列リテラルとしてエスケープ(二重エンコードされた JSON のデコード)

JSON を stringify すると、内側の引用符と特殊文字がエスケープされ、二重引用符で囲まれた JSON 文字列リテラルになり、安全に他の場所へ埋め込めます。

「リテラルにスタリンガファイする」とは

JSON 文字列を JSON.stringify に通すと、ダブルクォートで囲まれ、内部のクォートとバックスラッシュがエスケープされた、1 つの安全な文字列値が得られます。

なぜ必要か

JSON を別の JSON フィールドに埋め込んだり、文字列型の DB カラムに格納したり、環境変数や URL パラメータとして渡すには、エスケープ済みの文字列リテラルが必要です。

エスケープのルール

ダブルクォートはバックスラッシュでエスケープ、バックスラッシュは 2 倍に、改行やタブのような制御文字は 2 文字のエスケープシーケンスになります。結果には生の改行は含まれません。

二重エンコードされた JSON のデコード

エスケープされたクォートで始まり、エスケープされたクォート列を含む文字列を受け取ったら、それは stringify されたものです。1 度パースして内部の JSON 文字列を取り出し、もう 1 度パースして実際の値を得ます。

二重エンコードが現れる場所

コンテキストオブジェクトをシリアライズするロギングフレームワーク、JSON 本文を 'body' フィールドに入れる webhook、JSON-as-string のエンベロープを送るメッセージキュー、text や varchar 型の DB カラムが代表的な源です。先頭のクォートと偶数個のバックスラッシュが手掛かりです。

ログ中の埋め込み JSON を扱う

構造化ロガーはオブジェクトをスタリンガファイして 1 行 1 値に保つことがよくあります。確認するときはログビューアからその行を取り出し、JSON.parse でエスケープを解いてから整形してください。複数行の JSON を grep するのは避け、1 行に整形された JSON のほうがずっと検索しやすいです。

ラウンドトリップ用のツール

ブラウザコンソール:JSON.parse(line) で内部 JSON を取り、JSON.stringify(...,null,2) で整形。Node CLI:'node -e "console.log(JSON.parse(process.argv[1]))" "<line>"' で両方を 1 回で。本サイトの JSON Stringify ツールは任意の深さのネストをワンクリックで扱えます。