1. 程式人生 > 其它 >03rapidJson學習之物件的建立、遍歷

03rapidJson學習之物件的建立、遍歷

技術標籤:c++json

03rapidJson學習之物件的建立、遍歷

概述:

這裡強調一點,物件是可以作為返回值返回的,因為物件是一個整體。而陣列是不能返回的,因為陣列必須依賴一個物件才能返回。陣列一般依賴doc作引用引數時,伴隨根物件返回。

1 物件的建立

//從doc中獲取string字串內容
std::string GetStrWithDoc(Document &doc) {
	rapidjson::StringBuffer buffer;//畫板
	rapidjson::Writer<StringBuffer> writer(buffer);//畫家交給畫板
	doc.
Accept(writer);//利用畫家將doc的內容畫進畫板 return buffer.GetString(); } //建立一個物件並返回.注意:陣列是不能返回的,因為陣列必須依賴一個物件才能返回. Value CreateObject(Document &doc, std::string cid, std::string rtsp, int para) { //1 設定doc的物件並且獲取分配器 doc.SetObject(); Document::AllocatorType &a = doc.GetAllocator(); //2 建立一個物件 Value o1
(kObjectType); //3 使用Value給物件的key賦值,以便呼叫AddMember Value v1(cid.c_str(), a); Value v2(rtsp.c_str(), a); //4 新增key到物件中 o1.AddMember("camera_uid", v1, a);//AddMember參2為物件時必須是Value型別,且物件都必須使用分配器 o1.AddMember("rtsp_url", v2, a); o1.AddMember("para", para, a);//int,bool不需要轉成Value型別即可傳參
//5 返回物件 return o1; } void test01() { Document doc; Value o1(kObjectType); //建立物件並返回 o1 = CreateObject(doc, "123", "rtsp_url", 0); doc.AddMember("obj", o1, doc.GetAllocator()); //列印 std::string str = GetStrWithDoc(doc); std::cout << str.c_str() << std::endl; } int main() { test01(); return 0; }

上面程式結果:
在這裡插入圖片描述

2 物件的遍歷
參照官方給出的文件,只給出了兩種遍歷物件的方式。一種是迭代器遍歷;另一種是使用C++11新特性auto。對比陣列少了下標型別的遍歷,大家有時間可以試試。
1)迭代器遍歷

//物件的遍歷-迭代器
void test02() {
	Document doc;
	Value o1(kObjectType);

	//利用上面的函式建立物件
	o1 = CreateObject(doc, "123", "rtsp_url", 0);
	//doc.AddMember("object", o1, doc.GetAllocator());

	if (o1.IsObject() == false) {
		return;
	}

	//物件裡的七種型別,用於判斷物件的value型別,因為我在if已經判斷是哪種型別,所以實際上無需再用這個陣列,
	static const char* kTypeNames[] ={ "Null", "False", "True", "Object", "Array", "String", "Number" };

	//迭代器遍歷物件,遍歷的物件是我們剛建立的o1,當然你也可以遍歷其它物件,只要是物件即可,不一定是doc
	for (Value::ConstMemberIterator it = o1.MemberBegin(); it != o1.MemberEnd(); ++it) {
		if (o1.HasMember(it->name) && it->value.IsString()) {
			//必須保證it指向的值是存在,否則[]索引時報錯,這就是我們上面呼叫HasMember的原因,並且注意值型別是使用value去判斷,否則報錯
			printf("I am key = %s. value = %s, type = %s.\n", it->name.GetString(), it->value.GetString(), kTypeNames[it->value.GetType()]);
		}
		else if (o1.HasMember(it->name) && it->value.IsInt()) {
			printf("I am key = %s. value = %d, type = %s.\n", it->name.GetString(), it->value.GetInt(), kTypeNames[it->value.GetType()]);
		}
		else {
			//其它型別一樣判斷
		}
		
	}

}

上面程式結構:
在這裡插入圖片描述

2)C++11新特性遍歷
我們呼叫上面的建立物件函式後,我在使用auto新特性遍歷時,發現VS給我報錯了,點選它大概的意思就是說我沒有給這個物件呼叫doc.GetAllocator()分配記憶體,導致無法遍歷。所以我們想要使用auto新特性遍歷物件好像只能遍歷doc根物件了,其它物件只能使用上面的迭代器遍歷了,不過已經足夠了。
在這裡插入圖片描述

3 總結

  • 1)物件的建立可以由返回值來返回,陣列不能。
  • 2)一般物件的遍歷只能使用迭代器去遍歷,doc根物件可以使用auto新特性遍歷。