1. 程式人生 > 其它 >01rapidJson學習之rapidJson的初始化

01rapidJson學習之rapidJson的初始化

技術標籤:c++

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。