別のJSON文字列の中にJSON文字列を埋め込む必要があります——それ自体がJSONペイロードを含むログメッセージかもしれません。あるいはクォートを含む文字列を含むシェルコマンドを書いています。あるいは、別のURLをクエリパラメータとして運ばなければならないURLを構築しています。これらの状況はいずれも、エスケープを必要とします。つまり、そうでなければ構文として解釈されてしまう文字を、リテラルなデータとして扱われる形式に変換することです。
文脈が異なれば、エスケープの方法も異なります。JSONはバックスラッシュでクォートをエスケープし、改行のような特殊文字を\nのように表現します。シェルのエスケープは、使っているクォートのスタイルによって異なります。URLエスケープは、予約文字をパーセントエンコードしますが、他の2つとはまったく異なる方法です。これらを混同する——URLエスケープが必要な場所にJSONエスケープを適用する——と、ほとんど正しく見えるのに紛らわしい形で失敗する出力が生まれます。
二重エスケープの問題
この領域で最もよくあるバグの1つは、二重エスケープです。文字列があなたのコードによって一度エスケープされ、それがまだ生のデータだと想定しているライブラリやフレームワークによってもう一度エスケープされ、1つのバックスラッシュが2つになり、静かにデータが破損します。これを診断するには、どこで余分な層が導入されたかを正確に把握するために、段階的にアンエスケープしていく必要があります——特に長い文字列では手作業で行うのは面倒です。
複数の形式でエスケープ・アンエスケープ
Bellowsには、41個の開発者ツールの1つとして、JSON、HTML、URL形式に対応した文字列エスケープツールが含まれています。生の文字列を貼り付ければ、特定の文脈で適切にエスケープされた形が表示され、エスケープされた文字列を貼り付ければ、元の生の値が表示されます。
文字列の中に文字列を埋め込む
それ自体がフィールド値としてJSON文字列を含むJSONペイロードを構築すること、あるいは任意のユーザー入力を安全に含める必要のあるログメッセージを構築することは、いずれも外側の構造を破損させないために正しいエスケープを必要とします。
二重にエスケープされたデータの診断
文字列が本来よりも多くの回数エスケープされているように見えるとき、それを1層ずつアンエスケープしていくことで、余分なエンコーディングがどこで導入されたかが正確に明らかになり、たいていの場合それが原因のコードを突き止める最も速い方法です。