通常c++解析json会使用jsoncpp,使用起来也很方便,但是需要引入几个源文件。
如果你不希望引入源文件或第三方库,那么picojson就是一个比较好的选择,因为它只有一个头文件。
本文通过一个例子来讲解如何使用picojson
情景介绍
统计某一个问题的答题情况,包括每个选项有多少人选择,一共多少人答题。
{
"questionId":1,
"answerSummary":
{
"attendStudents":200,
"optionStats":[
{
"num":20,
"option":0
},
{
"num":60,
"option":1
},
{
"num":100,
"option":2
}
]
}
}
实现代码
std::string ToJson() {
//picojson::value 同时只能代表一种类型,要么是double等原始类型,或者是数组array,或者object
//object可以保存键值对,是个map
//object键值对的值可以是任意类型的value
picojson::value json;
//这里json保存键值对,所以是个object
json.set<picojson::object>(picojson::object());
json.get<picojson::object>()["questionId"] = picojson::value(double(1));
//这里answerSummary也是一个键值对,所以也是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是一个数组,所以是个array
json.get<picojson::object>()["answerSummary"].get<picojson::object>()["optionStats"].set<picojson::array>(picojson::array());
picojson::value option_stat;
//这里option_stat也是一个键值对,所以也是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的实现是个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的实现是个vector,所以使用push_back
json.get<picojson::object>()["answerSummary"].get<picojson::object>()["optionStats"].get<picojson::array>().push_back(option_stat);
return json.serialize();
};