本文共 2436 字,大约阅读时间需要 8 分钟。
01rapidJson学习之rapidJson的初始化
1 rapidJson的初始化
由于我们经常通过初始化添加值到string字符串中,所以这里封装成一个简单函数。//rapidJson有3种初始化方式:1)改造初始化。2)set方法初始化。3)=号赋值。//注意:1)凡是调用AddMember函数(不管是doc还是kObjectType类型)添加对象,参2都必须使用Value类型,不能直接使用添加,否则报如下类似错误;int,bool这些非对象可以直接添加。例如doc.AddMember("errMsg", errMsg, a);//error2)凡是初始化Value类型的是一个对象(容器),都必须加上分配器AllocatorType,否则报错,例如v3 = cid;是错误的,所以=号赋值一般是初始化int,bool这些非对象值。最好推荐使用构造。3)凡是组装json格式即调用AddMember函数添加内容到doc,在此之前都必须设置doc.SetObject();4)凡是在doc里添加复杂结构的,都需要在定义Value时注明是何种类型。这里的复杂结构一般是指数组和对象。(这一点是后面要用的)例如:Value a1(kArrayType);// 创建一个数组,必须注明,否则后面使用a1.PushBack操作a1时会报错。Value o1(kObjectType);// 创建一个对象,必须注明,否则后面使用o1.AddMember操作o1时会报错。
上面很多时候错误都是一样的,只不过相应函数改变一下,上面这些坑我都基本踩过了,这里记录防止再踩。
//doc类型如下:enum Type { kNullType = 0, //!< null kFalseType = 1, //!< false kTrueType = 2, //!< true kObjectType = 3, //!< object kArrayType = 4, //!< array kStringType = 5, //!< string kNumberType = 6 //!< number};
代码如下:
//Rapid的初始化和创建成员并返回添加的字符串std::string RapidInit(rapidjson::Document &doc, int status, std::string errMsg, std::string cid, std::string para){ //1 定义doc并获取该doc的分配器 //Document doc;//参数代替 Document::AllocatorType& a = doc.GetAllocator(); doc.SetObject();//每次调用AddMember添加成员都必须设置,否则报错,很多错误是因这个原因引起. //2 将上面的值赋给Value的类型,共3种 Value v1(status); //1)构造初始化 Value v2; //2)set方法初始化(可以set成bool,int,string...) v2.SetString(errMsg.c_str(), a); Value v3; //3)等号初始化 //v3 = cid; //用对象容器例如string这些给Value赋值时必须加上分配器,否则等号重载报错,故这里报错 v3.SetString(cid.c_str(), a); Value v4(para.c_str(), a); //最好使用构造初始化,不过构造字符串时的参1为UTF,需要转成const char*,参2为分配器 //3 添加成员 doc.AddMember("status", v1, a); //该函数为重载函数,一般看第一个重载即可,有三个参数,参1为keyName,参2为T v也就是Value类型的值,参3为分配器 doc.AddMember("errMsg", v2, a); doc.AddMember("cid", v3, a); doc.AddMember("para", v4, a); //4 从doc中获取字符串,一般可以独立分开成类似打印函数. rapidjson::StringBuffer buffer;//画板 rapidjson::Writer writer(buffer);//画家交给画板 doc.Accept(writer);//利用画家将doc的内容画进画板 return buffer.GetString(); }//Rapid的初始化和创建成员并返回添加的字符串void test01(){ rapidjson::Document doc; std::string init = RapidInit(doc, 0, "Ok", "123", "c++11"); std::cout<< init <
初始化并不难,但是有些地方需要自己注意。
结果如下:转载地址:http://yifv.baihongyu.com/