ぎじゅつめもブログ

主にアプリ開発の技術メモを残していきます。

【cocos2d-x】picojsonでJSONファイルを読み込む

cocos2d-x 3.x になってから2.x系から大幅に変更があって戸惑いました。(クラス名の頭からCCがとれたからそう感じるだけでしょうか。)

ローカルのjsonを読み込むメモです。cocos2d-xプロジェクトへ追加したjsonを使用します。
picojsonというjsonをパースしてくれる便利なライブラリを使います。
(環境:xcode5.1, cocos2d-x-3.1rc0)

{
    "hoge" :[
                {"x":1, "y":1, "z":1}, 
                {"x":2, "y":1, "z":1}
                ]
}
//ファイルパスの取得
FileUtils* fileUtils = FileUtils::getInstance();
const char* path = "hogehoge.json";
std::string fullpath = fileUtils->fullPathForFilename(path);

// ファイルオープン
ifstream inputStream;
string thisLine;
inputStream.open(fullpath.c_str());
if (!inputStream.is_open())
{
    cerr << "cannot open file!" << endl;
    exit(1);
}

stringstream sstream;
while (getline(inputStream, thisLine))
{
    sstream << thisLine;
}
inputStream.close();
cout << "finish opening file!" << endl;
    
CCLOG("sstream:%s", sstream.str().c_str());
    
// JSONのパース
picojson::value v; 
picojson::parse(v, sstream);

picojson::object& all = v.get<picojson::object>();
picojson::array& array = all["hoge"].get<picojson::array>();
for (picojson::array::iterator it = array.begin(); it != array.end(); it++)
{
    picojson::object& tmpObject = it->get<picojson::object>();
    int x = (int)tmpObject["x"].get<double>();
    int y = (int)tmpObject["y"].get<double>();
    int z = (int)tmpObject["z"].get<double>();
    CCLOG("x:%d, y:%d, z:%d", x, y, z);
}

以上です。

参考
http://taichino.com/programming/2068
http://nirasan.hatenablog.com/entry/2013/10/24/232905
http://stackoverflow.com/questions/12171445/file-i-o-using-cocos2d-x