メモ: U+2028,U+2029が含まれるJSONデータをeval関数を使ってデコードするとエラーになる

標準

※firefoxとwebkitで確認してます。

JSONを使ってデータをやり取りするととっても便利なのですが、最近それでハマったのでメモ。

UNICODEには、改行文字がいろいろと定義されているみたいです。
UAX #13: Unicode Newline Guidelines

その中の”LINE SEPARATOR (U+2028)”と”PARAGRAPH SEPARATOR (U+2029)”を含む文字列をJSONデータとしてデコードする際にeval関数を利用すると構文エラーが発生し、うまくパースできません。

テストコードはこんな感じ。

var plain_data = "{data: 'plain-data'}";
var ls_data = "{data: 'ls" + "\u2028" + "-data'}";
var ps_data = "{data: 'ps" + "\u2029" + "-data'}";
//  これは普通にOK
var d1 = eval('(' + plain_data + ')');
document.write( d1.data );
// LSが含まれているとNG
var d2 = eval('(' + ls_data + ')');
document.write( d2.data );
// PSが含まれていてもNG
var d3 = eval('(' + ps_data + ')');
document.write( d3.data );

解決策としては、evalにかける前に、

data.replace(/\u2028|\u2029/g, '');

等として、LS,PSを削除するまたは、LF等の別の改行コードに置き換えるのがよろしいかなと。

もしくは、jQueryのajax系のメソッドを利用すると問題なくパースしてくれるようです。

コメントを残す

Page optimized by WP Minify WordPress Plugin