1. 程式人生 > >C/C++學習筆記-rapidjson的簡單使用

C/C++學習筆記-rapidjson的簡單使用

  • rapidjson是什麼,為什麼選擇rapidjson? 

Answer:rapidjson 是一個 C++ 的 JSON 解析器及生成器 。rapidjson不依賴第三方庫,而且只包含標頭檔案,使用方便簡單。

  • rapidjson如何安裝?

Answer:rapidjson 的安裝很簡單,因為只包含標頭檔案可用,且不依賴第三方庫因此。我們只需把標頭檔案下載下來就可以用。檔案下載地址:https://github.com/Tencent/rapidjson.gitrapidjson的官網資料:http://rapidjson.org/zh-cn/。

下載下來後,開啟有一個include目錄,這就是我們需要的東西,然後把這個東西直接拷貝到我們的工程路徑,如果提示有錯,先確定拷貝過來後是否是否連線了。連線方法:ecilpse->Roject->Properties->C/C++ General->Paths and Symbols->includes.十分簡單。


 有的時候,需要的json格式是十分複雜的,如下所示:

  •  rapidjson生成複雜的json串
{
    "name":"jack",//常規的
    "age":18,
    "sub":["a","b"],//value是陣列
    "elp":[ {"a":"A","b":"B"},//value是一個數組且裡面每個元素又是一個json格式
            {"c":"C","d":"D"},
          ]
}
std::string build_json_msg(){

	rapidjson::Document doc;//生成DOM元素
	doc.SetObject();
	rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();//生成一個分配器

	//構建鍵值對
	doc.AddMember("name","jack",allocator);
	doc.AddMember("age",18,allocator);
	//====構建陣列元素====["1","2"]
		rapidjson::Value array_sub(rapidjson::kArrayType);//建立一個數組型別物件
		array_sub.PushBack("a",allocator);
		array_sub.PushBack("b",allocator);
	//================
	doc.AddMember("sub",array_sub,allocator);
	//====構建陣列object===[{"1":2,},{}]
		rapidjson::Value array_json(rapidjson::kArrayType);
			rapidjson::Value obj(rapidjson::kObjectType);//每一個數組裡面是一個json格式
				obj.AddMember("a","A",allocator);
				obj.AddMember("b","B",allocator);
			array_json.PushBack(obj,allocator);

			rapidjson::Value obj1(rapidjson::kObjectType);//每一個數組裡面是一個json格式
				obj1.AddMember("c","C",allocator);
				obj1.AddMember("d","D",allocator);
			array_json.PushBack(obj1,allocator);
			array_json.PushBack(obj1,allocator);
	doc.AddMember("elp",array_json,allocator);


	rapidjson::StringBuffer s;
	rapidjson::Writer<rapidjson::StringBuffer> writer(s);
	doc.Accept(writer);

	return std::string(s.GetString());

}

 在生成的時候我們需要幾個十分重要的物件,Document、AllocatorType。剛開始的三行程式碼是比較固定的,先申明一個doc和一個分配器。

rapidjson::Document doc;//生成DOM元素
doc.SetObject();
rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();//生成一個分配器

我們新增json元素主要通過doc.AddMember(key,value,分配器)的形式來生成。如果json格式很簡單,那麼程式碼也很簡單,如下:

doc.AddMember("name","jack",allocator);
doc.AddMember("age",18,allocator);

 但是,如果涉及到陣列。就需要注意一下。首先,我們需要建立一個數組型別的物件。然後把數組裡面的內容PushBack進去。最後同樣通過doc.AddMember()新增進去。但是value卻變成了array_sub.說明AddMember()的第二個引數,不僅可以是值還可以是物件。

rapidjson::Value array_sub(rapidjson::kArrayType);//建立一個數組型別物件
		array_sub.PushBack("a",allocator);
		array_sub.PushBack("b",allocator);
	//================
doc.AddMember("sub",array_sub,allocator);

同樣,如果數組裡面是json串,該怎麼辦呢?其實寫法按著上面的邏輯來,看上面的程式碼,只不過把‘a’換成object型別的。具體寫法如下:

//====構建陣列object===[{"1":2,},{}]
		rapidjson::Value array_json(rapidjson::kArrayType);
			rapidjson::Value obj(rapidjson::kObjectType);//每一個數組裡面是一個json格式
				obj.AddMember("a","A",allocator);
				obj.AddMember("b","B",allocator);
			array_json.PushBack(obj,allocator);

			rapidjson::Value obj1(rapidjson::kObjectType);//每一個數組裡面是一個json格式
				obj1.AddMember("c","C",allocator);
				obj1.AddMember("d","D",allocator);
			array_json.PushBack(obj1,allocator);
			array_json.PushBack(obj1,allocator);
	doc.AddMember("elp",array_json,allocator);
  •  rapidjson解析複雜的json串