JSON のルーズなパーサー作りました。

設定系とかで JSON を使うときにいちいちクォーテーション(またはダブルクォーテーション)で囲むのめんどくさいなと思って、いい感じに勝手に判断してくれるやつ作りました。以下の gist に貼り付けてます。

https://gist.github.com/3258401

これを作るときに本家の json_parse を大いにパク・・・参考にさせて頂きました。
ちなみに本家は以下。
https://github.com/douglascrockford/JSON-js/

今回作ったやつは、これが

{"param1":"value1","param":"value2"}

こんな風に書けます。

{param1: value1, param: value2}

数値にできそうな奴(1234 とか .5 とか)は number に、true / false は boolean に、 null は null に、 あと標準の JSON には無い NaN とか undefined とか Infinity にも対応してます。undefined が要るのかって話は置いときますが。。

途中まではオブジェクトのキーにオブジェクトとか設定できるようにしてたんですが、それはやっぱりやり過ぎかなと思って無しにしました。

で、速度的にはどうなんやろうと思って試してみました。対象は今回作ったやつと、元ネタと、JSON2.js の JSON.parse と IE9 のネイティブの JSON.parse の 4 種類です。

こんな感じのコードでチェック。QUnit なのはご愛嬌ということで。

var start = new Date().getTime(),
    i = 0, length = 100000;

for(i = 0; i < length; i++){
    JSON.parseLoose("{A: { key1:val1, key2: val2  foo, key3: val3}, B: [foo, bar, true, null, 200, 0.5]}");
}
ok(true, "parseLoose = " + ((new Date().getTime() - start) / 1000) + "(seconds)");

start = new Date().getTime();
for(i = 0; i < length; i++){
    json_parse("{\"A\": { \"key1\":\"val1\", \"key2\": \"val2  foo\", \"key3\": \"val3\"}, \"B\" : [\"foo\", \"bar\", true, null, 200, 0.5]}");
}
ok(true, "json_parse = " + ((new Date().getTime() - start) / 1000) + "(seconds)");

start = new Date().getTime();
for(i = 0; i < length; i++){
    JSON2.parse("{\"A\": { \"key1\":\"val1\", \"key2\": \"val2  foo\", \"key3\": \"val3\"}, \"B\" : [\"foo\", \"bar\", true, null, 200, 0.5]}");
}
ok(true, "JSON2 = " + ((new Date().getTime() - start) / 1000) + "(seconds)");

start = new Date().getTime();
for(i = 0; i < length; i++){
    JSON.parse("{\"A\": { \"key1\":\"val1\", \"key2\": \"val2  foo\", \"key3\": \"val3\"}, \"B\" : [\"foo\", \"bar\", true, null, 200, 0.5]}");
}
ok(true, "parse = " + ((new Date().getTime() - start) / 1000) + "(seconds)");

結果は以下のような感じ。

1.parseLoose = 2.995(seconds)
2.json_parse = 1.749(seconds)
3.JSON2 = 0.94(seconds)
4.parse = 0.265(seconds)

今回作ったのが、一番遅くて IE9 の JSON.parse の 10 倍遅いですね。。

html の data-* 属性使って設定を書くときとか結構便利やと思って作ったんですが、10 倍って数字見ると悩みますね。