Hatena::ブログ(Diary)

脳味噌出力中

2008-12-07 TinyJSON

[] 04:46

Boostを駆使したC++JSONパーサ、TinyJSONというのがあるらしい。

ソースは

TinyJSONを使ってみる - 三次元日誌

総本山は

no title

取り敢えず、何も考えずにテストしようとするも

/home/use/include/tinyjson/tinyjson.hpp: In function 'typename json::grammar<typename Iterator::value_type>::variant json::parse(const Iterator&, const Iterator&)':

/home/user/include/tinyjson/tinyjson.hpp:549: error: expected `;' before 'st'

/home/user/include/tinyjson/tinyjson.hpp:550: error: 'st' was not declared in this scope

と怒られる。使っているのはgccの4.1.2(大分古いな……)。これは多分テンプレート化されたクラスの中の型を参照しようとした時、コンパイラは型か値か判断できずに困るのでtypenameを付けましょうという例のアレだろう。

549行目を

json::grammar< typename Iterator::value_type >::stack st;

から、

typename json::grammar< typename Iterator::value_type >::stack st;

へ変えるとコンパイル成功。行頭にtypenameを付けただけ。

実際にパーサを使おうとすると更に564行目でも怒られるので、

return json::grammar< typename Iterator::value_type >::variant(new boost::any());

これを

return typename json::grammar< typename Iterator::value_type >::variant(new boost::any());

とまたtypenameを付けた。これで漸く問題なくコンパイルできるように。

(2008.12.11)

設定ファイルとしてJSONを使えるように、アクセサを作成中。

json::JsonAccessor accessor("test.json") ;
std::string str(accessor["key1"][0]) ; //"value1"
double x = accessor["key1"][1].to_f() ; //"1.345e+02"
int i    = accessor["key1"][2].to_i() ; //"245"

こんな感じにできたら良いな。

(2008.12.12)

できた。上の通りに。

ただBoost使いまくりの手抜きしまくり。lexical_castとshared_ptrの雨あられ。

仮想関数の使い方も何か間違ってる気がするので後で見直そう。うう。

トラックバック - http://d.hatena.ne.jp/S_Nakayama/20081207/1228592806