最近はネットを使ったゲームも多く、JSONでやり取りしているゲームも多いと思いますので、cocos2d-x 2.2.1 でのJSONの利用方法について書きます。
cocos2d-xでのJSONパーサーといえば、下記の清水様のブログの記事にありますspine/Json.hが有名で、cocos2d-xの本体に付属しているという事で自分も使っています。
cocos2d-xにおけるJSONパーサー
今回はこちらを使用する際の注意点と、付け加えておくと便利なメソッドを紹介します。
※2013/12/07 t-model 様のご指摘があり、後半のbool値取得の部分の文章を変更させていただきました。
まずはじめに注意点です。
こちらのパーサーではcppの67行目にありますparse_numberメソッドの中を見ていただくとわかる通り、JSONに書かれています数値はfloat値でパースしており、それをvaluefloatにはfloat値のままで、valueintにはint値にキャストしたものが保存されます。
68行目
float n = 0, sign = 1, scale = 0;
95、96行目
item->valuefloat = n;
item->valueint = (int)n;
※整数で掛かれた数値を整数値のまま取り出したければ改良が必要です。
またJson_getIntでint値を取り出そうとした場合は、valuefloatをintにキャストして取り出しています。
370行目
int Json_getInt (Json* value, const char* name, int defaultValue) {
value = Json_getItem(value, name);
return value ? (int)value->valuefloat : defaultValue;
}
※valueintに保存された値を取り出したい時にはJson_getItemを利用して、自力でvalueintを取ってこないといけません。
何故にJson_getIntで素直にvalueintを返さないんでしょうか?
入れる時にintでキャストをしているから問題は無いと思うのですが…
知っている人がいたら教えといて下さい。
次に付け加えておくと便利なメソッドを紹介します。
現行のまま使用しますとJSONにboolがある時はJson_getItemを利用しないといけません。
例えば、"abc":false、"def":true"などの時、このパーサーではtypeにJson_FalseかJson_Trueを入れ、Json_Trueの場合はvaluintに1を入れてくれるのですが一発で取り出せるメソッドが無く、Json_getItemを利用しないとbool判定ができないのです。
なので下記のようなメソッドを作っておくと楽です。
下記のメソッドでは入力されたjsonが存在していて、かつパースした結果のtypeがJson_True かJson_Falseであればtrueかfalseを返し、それ以外はdefaultValueを返す事を期待しています。
spine/Json.h
bool Json_getBool (Json* json, const char *name, bool defaultValue);
spine/Json.cpp
bool Json_getBool (Json* value, const char* name, bool defaultValue) {
value = Json_getItem(value, name);
return value && (value->type == Json_True || value->type == Json_False) ? value->type == Json_True: defaultValue;
}
次回はCCDictionaryからJSONを作ったりするやり方や、実際の通信(httpclientやwebsocket)への応用などを書ければと思っています。