picojsonを使ってみる

テーマ:
picojsonとは、Kazuho氏によって作成されたJson Parserです。
github → 詳細はこちら

現在作成中のアプリでJsonを使うことになったのでParserを探していたのですが、picojsonが良いとのことだったので利用させてもらうことにしました。以下をインクルードすれば標準でも使うことができるようなのですが、あまりよろしくないとのこと。

#include "spine/Json.h"

picojsonの使い方はググればすぐにでてきますが、ヒットしにくかったものがあったので自分のためにも書いておくことにします。 まず、プロジェクトに追加してインクルードします。

#include "picojson.h"

この時点で利用することができるようになります。 いくつかパースしたいデータとそのパース方法のペアを書いていきます。

{
    "name": "sacchy"
}

const char* json = "{\"name\":\"sacchy\"}";
picojson::value v;
std::string err;
picojson::parse(v, json, json + strlen(json), &err);

if (err.empty())
{
     picojson::object& o = v.get<picojson::object>();
     CCLog("%s",o["name"].get<std::string>().c_str());
}


{
    "Human": {
        "name": "sacchy"
    }
}

const char* json = "{\"Human\":{\"name\":\"sacchy\"}}";
picojson::value v;
std::string err;
picojson::parse(v, json, json + strlen(json), &err);

if (err.empty())
{
     picojson::object& o = v.get<picojson::object>();
     picojson::object& e = o["Human"].get<picojson::object>();
     CCLog("%s",e["name"].get<std::string>().c_str());
}


{
    "array": [
        {
            "Human": {
                "name": "sacchy"
            }
        }
    ]
}

const char* json = "{\"array\":[{\"Human\":{\"name\":\"sacchy\"}}]}";
picojson::value v;
std::string err;
picojson::parse(v, json, json + strlen(json), &err);


if (err.empty())
{
	picojson::object& o = v.get<picojson::object>();
	picojson::array& array = o["array"].get<picojson::array>();
	for (picojson::array::iterator it = array.begin(); it != array.end(); it++)
	{
		picojson::object& o = it->get<picojson::object>();
		picojson::object& e = o["Human"].get<picojson::object>();
		CCLog("%s",e["name"].get<std::string>().c_str());
	}	
}


[
    {
        "Human": {
            "name": "sacchy"
        }
    }
]

const char* json = "[{\"Human\":{\"name\":\"sacchy\"}}]";
picojson::value v;
std::string err;
picojson::parse(v, json, json + strlen(json), &err);


if (err.empty())
{
	picojson::array array = v.get<picojson::array>();
	for (picojson::array::iterator it = array.begin(); it != array.end(); it++)
	{
		picojson::object& o = it->get<picojson::object>();
		picojson::object& e = o["Human"].get<picojson::object>();
		CCLog("%s",e["name"].get<std::string>().c_str());
	}
}


以上です。最後の配列に名前がないデータ形式にハマってしまったので参考になればと思います。あとおまけですが、CCHttpRequestを使って取得したデータについても同じようにパースできます。バッファーの部分が気持ち悪いです。

void TestScene::onHttpRequestCompleted(CCNode *sender, void *data)
{
    CCHttpResponse *response = (CCHttpResponse *) data;
    if (!response->isSucceed()) return;
    
    CCHttpRequest *request = response->getHttpRequest();
    std::vector<char> *buffer = response->getResponseData();
    const char *json = &(*buffer)[0];
    CCLog("%s",json);
     ...
}
AD