cocos2d-xでRapidJSONを使ってみた

ChainZ(クリエイター)
いろいろやってます。

RapidJSON

RapidJSON(https://github.com/miloyip/rapidjson)はパフォーマンス重視のJSONライブラリです。cocos2d-xのライブラリにはRapidJSONが入っているので、includeするだけで使えます。

cocos2d-xでRapidJSONを使う

RapidJSONを使うには、cocos/external/jsonのパスをHeader Search Pathに追加する必要があります。xcodeなら、プロジェクトのターゲットからBuild Settingsというタブに切り替えて、User Header Search Paths$(SRCROOT)/../cocos2d/cocos/external/jsonを追加してください。

そのあと、json/rapidjson.hincludeすればRapidJSONが使えるようになります。

1
#include "json/rapidjson.h"

cocos2d-xのRapidJSONは若干バージョンが古いので、最新のバージョンを使いたければ、リポジトリからソースコードをダウンロードしてUser Header Search Pathをそれなりに変えれば大丈夫です。

JSONにエンコード

文字列から

1
2
3
4
5
6
std::string str = "{ \"say\" : \"Hello World\" }";
rapidjson::Document d;
d.Parse<rapidjson::ParseFlag::kParseDefaultFlags>(str);

rapidjson::Value& hello = d["say"];
CCLOG("say: %s", hello.getString());

ファイルから

1
2
3
4
5
6
7
8
// test.json
{
    "name" : "cocos",
    "profile" : {
        "age" : 17,
        "des" : "a cross platform game engine"
    }
}
1
2
3
4
5
6
7
8
auto path = FileUtils::getInstance()->getWritablePath();
auto file = path + "test.json";
std::string content = FileUtils::getInstance()->getStringFromFile(file);

d.Parse<rapidjson::ParseFlag::kParseDefaultFlags>(content);
rapidjson::Value& des = d["profile"]["des"];
CCLOG("cocos is %s", des.getString());
// cocos is a cross platform game engine

JSON WriterでJSONを作成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rapidjson::StringBuffer str;
rapidjson::Writer<rapidjson::StringBuffer> writer(str);

writer.StartObject();
writer.Key("say");
writer.String("Hello World");
writer.Key("array");
writer.StartArray();
for (int i = 0; i < 20; i++) {
    writer.Int(i);
}
writer.EndArray();
writer.EndObject();

CCLOG("%s", str.GetString());
// {"say":"Hello World","array":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}

まとめ

cocos2d-xで快適にJSONを使うには、恐らくヘルパーやラッパーの作成が必要になってきます。もし作業を減らしたい、そしてJSONをこだわらなければ、データはplist形式を使うのをおすすめします。