JSFLでevalを使ったJSON読み込みでinvalid label警告の回避方法とjson2.jsとの比較メモ

前回の記事
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読み込みもなかなかオススメです。

今回のソースコードも以下においておきます。興味があるかたは試してみてください。

JSFLダウンロード:jsfl_tips_005.zip
json2.jsfl同梱してませんので自分で入れて使ってください。

それでは、よき JSFL Life を!