通常c++解析json會(huì)使用jsoncpp,使用起來(lái)也很方便娃弓,但是需要引入幾個(gè)源文件典格。
如果你不希望引入源文件或第三方庫(kù),那么picojson就是一個(gè)比較好的選擇台丛,因?yàn)樗挥幸粋€(gè)頭文件耍缴。
本文通過一個(gè)例子來(lái)講解如何使用picojson
情景介紹
統(tǒng)計(jì)某一個(gè)問題的答題情況,包括每個(gè)選項(xiàng)有多少人選擇,一共多少人答題防嗡。
{
"questionId":1,
"answerSummary":
{
"attendStudents":200,
"optionStats":[
{
"num":20,
"option":0
},
{
"num":60,
"option":1
},
{
"num":100,
"option":2
}
]
}
}
實(shí)現(xiàn)代碼
std::string ToJson() {
//picojson::value 同時(shí)只能代表一種類型变汪,要么是double等原始類型,或者是數(shù)組array蚁趁,或者object
//object可以保存鍵值對(duì)裙盾,是個(gè)map
//object鍵值對(duì)的值可以是任意類型的value
picojson::value json;
//這里json保存鍵值對(duì),所以是個(gè)object
json.set<picojson::object>(picojson::object());
json.get<picojson::object>()["questionId"] = picojson::value(double(1));
//這里answerSummary也是一個(gè)鍵值對(duì)他嫡,所以也是object
json.get<picojson::object>()["answerSummary"].set<picojson::object>(picojson::object());
json.get<picojson::object>()["answerSummary"].get<picojson::object>()["attendStudents"] = picojson::value(double(200));
//這里optionStats是一個(gè)數(shù)組番官,所以是個(gè)array
json.get<picojson::object>()["answerSummary"].get<picojson::object>()["optionStats"].set<picojson::array>(picojson::array());
picojson::value option_stat;
//這里option_stat也是一個(gè)鍵值對(duì),所以也是object
option_stat.set<picojson::object>(picojson::object());
option_stat.get<picojson::object>()["option"] = picojson::value(double(0));
option_stat.get<picojson::object>()["num"] = picojson::value(double(20));
//array的實(shí)現(xiàn)是個(gè)vector涮瞻,所以使用push_back
json.get<picojson::object>()["answerSummary"].get<picojson::object>()["optionStats"].get<picojson::array>().push_back(option_stat);
option_stat.get<picojson::object>()["option"] = picojson::value(double(1));
option_stat.get<picojson::object>()["num"] = picojson::value(double(60));
//array的實(shí)現(xiàn)是個(gè)vector鲤拿,所以使用push_back
json.get<picojson::object>()["answerSummary"].get<picojson::object>()["optionStats"].get<picojson::array>().push_back(option_stat);
return json.serialize();
};