Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
てっく煮ブログ
[go: Go Back, main page]

Hatena::Diary

てっく煮ブログ

2006年11月17日

jsoncpp を試す

C++JSON を扱う必要があったので、jsoncpp というライブラリを試した。VC++ 2003/2005 で警告なしでビルドできた。すばらしい。

パース簡単。

std::string str = "{\"key1\":\"value\", \"key2\":true}";

Json::Reader reader;
Json::Value root;
bool b = reader.parse(str, root);

オブジェクトの参照も簡単。厳密にやったらこうなる。

if(root.type() == Json::objectValue){
    if(root.isMember("key1")){
        Json::Value key1 = root["key1"];
        if(key1.type() == Json::stringValue){
            printf(key1.asCString());
        }
    }
}

いい加減にも書ける。

printf(root["key1"].asCString());

json_value.cpp にて変換に失敗したときには assert 関数が実行されるよう定義されているが、ここで例外を投げるように修正すれば、上のいい加減なコード

try{
   printf(root["key1"].asCString());
}
catch(...){
}

と書けて幸せなんだけど、どうも警告がいっぱいでてしまう。そのへんは微妙にうれしくない感じ。

他にも、配列は size() が使えたり、getMemberNames() でハッシュの全部のキーを取得できたり、なかなか便利。もちろん、オブジェクトの書き出しもサポート。C++ で IO 扱うには実はかなり便利なライブラリかもしれない。

ライブラリの詳細は JsonCpp Documentation にて。

2006年11月09日

[]prototype.js 1.4.0 の Enumerable.min のバグ

script.aculo.us をいじっていて気づいた Enumerable.min のバグ。

実証コードはこんな感じ。配列の最小値 0 を返すべきなのに...なぜか 1 が返ってきます。

>>> [0,1,2,3].min()
1

該当部分のソースコードはこうなってます。

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (value <= (result || value))
        result = value;
    });
    return result;
  },

バグの原因は each の2回目で if (value <= (result || value)) が if (1 <= (0 || 1)) すなわち if (true) となってしまうところにあるようです。

prototype.js では undefined かどうかを調べるのに || 演算子を使ってることが多いのですが、0 や "" が false になってしまうことに注意しなければならないですね。

なお、この部分のコードは 1.5.0 rc1 で次のように修正されてます。

  min: function(iterator) {
    var result;
    this.each(function(value, index) {
      value = (iterator || Prototype.K)(value, index);
      if (result == undefined || value < result)
        result = value;
    });
    return result;
  },

多くの人が使ってる prototype.js 1.4 にこんなバグが潜んでいたとは。恐ろしい。1.5 を正式リリースしたら、1.4.1 を出してほしいものです。