01rapidJson学习之rapidJson的初始化

01rapidJson学习之rapidJson的初始化

1 rapidJson的初始化
由于我们经常通过初始化添加值到string字符串中,所以这里封装成一个简单函数。

//rapidJson有3种初始化方式:
1)改造初始化。
2)set方法初始化。
3=号赋值。

//注意:
1)凡是调用AddMember函数(不管是doc还是kObjectType类型)添加对象,参2都必须使用Value类型,不能直接使用添加,否则报如下类似错误;int,bool这些非对象可以直接添加。例如doc.AddMember("errMsg", errMsg, a);//error
2)凡是初始化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<char>,需要转成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<StringBuffer> 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 <<std::endl;
}

初始化并不难,但是有些地方需要自己注意。
结果如下:
在这里插入图片描述

  • 这里记录一下使用VSCode编译时配置launch.json的调试路径miDebuggerPath,Windows下必须加上.exe否则无法匹配。
  • 并且如果在Windows下用的是git的bash,使用\的路径可能无法适配导致路径出错。
  • tasks.json的编译命令调试C++时必须时g++,不能是gcc,否则说你未定义一大堆,例如undefined std::cout。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值