JSONでの改行エスケープ

2011/11/03 7:15 PM

 

JSONを使ったコードを書いていて、改行の扱いでちょっと困ったのでそのことについて。

WebサーバはSAStrutsで書いているが、JSPの場合ならたいてい大丈夫だろう。
以下のような流れになっている。

1. ブラウザ:jQuery.postでWebサーバに検索を要求。
2. Webサーバ:検索結果をJSPでJSON形式で出力(文字列)。
3. ブラウザ:応答を受信。
4. ブラウザ:JSON.parseでデシリアライズ。
5. ブラウザ:jQuery.tmplプラグインで、テンプレートを使って、テキストエリア上に表示。

ところが、応答のJSONの内容に改行が含まれていると、JSON.parseでエラーが発生する。

これは、JSONには、改行コード、ダブルクォートはバックスラッシュでエスケープする決まりがあるからだ。

そこで、改行コード「\n」を「\\n」に置換するタグクラスUtilとメソッドescを書き、JSONを出力するJSPで挟んでみた。
(本当は半角)

public class Util {

public static String esc(String src) {
return src.replaceAll(“\n”, “\\n”);
}
}

このタグクラスとメソッドを、META-INF/Util.tldに定義する。

JSP側では、以下のように書く。

${f:h(util:esc(theValue))}

すると、確かにエラーは収まったが、当のテキストエリアには、「n」と表示されてしまう。

最初の「\」がエスケープされるだけで、「n」はそのまま文字列になってしまうからだ。

正解は、「\n」を「\\\\n」に置換。

こうすると、初回の解釈であるJSON.parseはエスケープされるが、テキストエリア上に表示されるときには「\n」となり、意図通り再現される。

完成形は以下。

public class Util {

public static String esc(String src) {
return src.replaceAll(“\n”, “\\\\n”).replaceAll(“\r”, “”);
}
}

ちなみに、「\r」は削除するが、ダブルクォートは、f:h()を通せば実体参照にエスケープされるので不要。



コメントはまだありません

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを書く

WordPress Themes