前回の記事
1ft-seabass.jp.MEMO – JSFLでjson2.jsライブラリを読みこんだら、すんなり使えたというメモ
で、json2.jsによるJSONの読み書きの話をしましたが、それとは別にJSFLでevalを使ったJSON読み込みをしたくてinvalid label警告でハマった件についてメモしておきます。json2.jsとの比較についても触れておきます。
エラーになるコード
JSFLでevalを使ったJSON読み込みをしたのですが、
eval_error.jsfl
// eval読み込み var jsonData = eval( '{ "test":1234567890 }' ); fl.trace( "jsonData : " + jsonData ); fl.trace( "jsonData.test : " + jsonData.test );
実行すると、以下のエラーが起きます。
以下の JavaScript エラーが発生しました :
ファイル “eval_error.jsfl” の 2 行目 :
{ “test”:1234567890 }
SyntaxError: invalid label
SyntaxError: invalid label ??
あれなんだっけ、すごく前に以前このエラー出して回避した気がするけど思い出せない。。。
思い出した、()をつけるんだった。
いろいろ調べてたら、この記事JavaScriptでJSONをeval – sshi.Continualをみつけてようやく思い出しました。
evalの中では、JSONデータを()で括る必要があるということでした。
ということで、以下のコードで動いた。
eval.jsfl
// eval読み込み var jsonData = eval( '( { "test":1234567890 } )' ); // ここを修正 fl.trace( "jsonData : " + jsonData ); fl.trace( "jsonData.test : " + jsonData.test );
結果は以下のとおり。
jsonData : [object Object]
jsonData.test : 1234567890
ところで、json2.jsとevalどっちが性能がいいの?
夕暮ログ JSON.parseとevalなどの比較とスピードテスト
ブラウザでこういうふうに触れている方が居まして、JSFLではjson2.jsとevalどっちが性能がいいかというと、ぶっちゃけあまり変わりません。
114KBのJSONデータで簡単なテスト
試しに以下の様なコードで114KBのJSONデータで簡単なテストしてみます。
compare.jsfl
// 114KBのJSONデータ(Swiffy) var swiffyStr = '~~~114KBのJSONデータなので割愛~~~'; // JSONLib読み込み var path = fl.scriptURI.substr( 0 , fl.scriptURI.lastIndexOf("/") + 1 ); fl.runScript( path + "json2.js" ); var startTime; // eval読み込み startTime = new Date().getTime(); var jsonData = eval( '(' + swiffyStr + ')' ); fl.trace( "eval読み込み time : " + ( new Date().getTime() - startTime ) + "ミリ秒" ); // json2.js読み込み startTime = new Date().getTime(); var jsonData = JSON.parse( swiffyStr ); fl.trace( "json2.js読み込み time : " + ( new Date().getTime() - startTime ) + "ミリ秒" );
結果は以下のとおり。
eval読み込み time : 18ミリ秒
json2.js読み込み time : 48ミリ秒
おお、、、意外にもjson2.jsのほうが遅いです。10回ほどテストしても同様の結果。
とはいえ、この差は、JSFLで114KBのデータなんてなかなか扱いませんし、許容範囲ではないでしょうか。
そのほか考察
自分なりに思うjson2.jsとevalについての使い所とか考察を書いておきます。あくまでJSFL限定のお話ですよ!
- eval
- 読み込み相当の機能しかないので、JSON作成というか書き出し(JSON.stringify相当)は出来ない
- json2.jsと比べ1ファイルで実行できるのがメリット。JSFLにおいては1ファイルでまとめると扱いやすいので大きなアドバンテージ。
- WEBでよく言われるXSSの観点でjson中に含まれる危険なjavascriptがあったら実行されてしまうので注意する必要
- 自前のツールであれば上記のアドバンテージを得るために採用したいケースもあると思う。
- 他者に公開して配布する場合はjson2.jsのほうがいいかも。
- こちらが高速なのはJSFLの組込み関数だからかもしれない?(勝手な推測)
- json2.js
- evalと比べてJSONを作るJSON.stringifyがあるのが大きい。JSONを作る必要があるJSFLなら即決json2.js。
- 外部にライブラリを置く必要があるがしょうがない。
- 実行速度はちょっと劣るが十分実用範囲で気にはならない。
- あるとすれば、114KBの100倍程度の10MBくらいのデータだったら何らかの影響があるくらいで、普段使いではそうそうない。
- evalと比べてJSONを作るJSON.stringifyがあるのが大きい。JSONを作る必要があるJSFLなら即決json2.js。
おわりに
いかがでしたでしょうか。evalでのJSON読み込みもなかなかオススメです。
今回のソースコードも以下においておきます。興味があるかたは試してみてください。
JSFLダウンロード:jsfl_tips_005.zip
json2.jsfl同梱してませんので自分で入れて使ってください。
それでは、よき JSFL Life を!