Home > Javascript > SafariでJSON - json.jsがUTF-8な文字列をparseできない

SafariでJSON - json.jsがUTF-8な文字列をparseできない

日本語の文字化けまわりで何かと話題に挙げられる事の多いMac OS XのSafariですが、www.json.orgにて配布されているjavascript側のJSON用ライブラリ json.js も期待通りに動かなくて小一時間ハマりました。

不具合 - 日本語が含まれるUTF-8文字列をparse出来ない

var s = '{"key":"value"}';
var obj = s.parseJSON();
alert(obj.key); // 結果: value

通常は上記のように JSON な文字列を parseJSON() メソッドにかけてあげることで javascript オブジェクトに変換されるのですが、 この文字列にUTF-8な文字列(日本語)が含まれていると、Safariの場合に限り、うまく動作しません:

var s = '{"key":"値"}';
var obj = s.parseJSON();
alert(obj.key); // 結果: undefined

[ サンプルコードはこちら ]

obj 自体が undefined になります。ディープに調査してないのですが、見た感じ、parseJSON() メソッドの中で行っている正規表現置換に問題がありそう。Safari の javascript runtime が、正規表現の中でマルチバイト文字をうまく認識できていない感じがします。

不具合確認環境 - Safari 1.3.2 および 2.0.3

解決策 - json.js は使わず eval() で対処

以下のように eval() を使って変換してしまうべし:

var s = '{"key":"値"}';
var obj = eval('(' + s + ')');
alert(obj.key); // 結果: 値

かっちょいい解決策はわかりません(汗)。とりあえず、JSON文字列 → javascript オブジェクトへの変換だけならば、json.js 使わずとも eval() で事足りるので、まぁいいかと。 ※じゃあ parseJSON() は何の為にあるのか、ちょっと気になりますが・・・今は無視する方向で。 以上、

Safariでも動作するAJAXサービスを作る際は、JSON変換は eval() を使うべし

という事で・・・いいのかな?多分。

※ファイルにBOMつければイケるのでは?と思って試したもののNGでした。

関連情報

Comments:1

ぬこ 2007-07-08 (日) 21:47

> じゃあ parseJSON() は何の為にあるのか
おそらくセキュアなevalということなんでしょう。
そのままevalすると、不正データがJSONに含まれていた場合、ブラウザをクラッシュさせてしまう危険性を孕んでいます。

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Home > Javascript > SafariでJSON - json.jsがUTF-8な文字列をparseできない

Search
Feeds

Page Top