02rapidJson學習之陣列的建立、遍歷
阿新 • • 發佈:2020-12-11
02rapidJson學習之陣列的建立、遍歷
概述:
建立陣列時我們需要注意以下內容:
1)不能直接返回陣列,我試過不行,因為陣列必須依賴某一物件.即若我們不將陣列新增到doc上,而直接返回陣列是不行的。
1 陣列的建立
//從doc中獲取string字串內容
std::string GetStrWithDoc(Document &doc){
rapidjson::StringBuffer buffer;//畫板
rapidjson::Writer<StringBuffer> writer(buffer);//畫家交給畫板
doc.Accept (writer);//利用畫家將doc的內容畫進畫板
return buffer.GetString();
}
/*
在doc中建立陣列.
注:不能直接返回陣列,我試過不行,因為陣列必須依賴某一物件.
即若我們不將陣列新增到doc上,而直接返回陣列是不行的.
*/
void RapidCreateArr(Document &doc){
//1 設定物件和獲取分配器,防止組裝json格式出錯
doc.SetObject();
Document::AllocatorType& a = doc.GetAllocator();
//2 建立陣列,必須宣告列舉為陣列型別
Value a1(kArrayType);
//3 這裡簡單迴圈新增int,一般數組裡面都是迴圈新增多個物件
for(auto i = 0; i < 5; i++){
a1.PushBack(i, a);
}
//可以連續建立,因為返回的是引用
a1.PushBack("C++11", a).PushBack("C++14", a);
//4 必須將陣列繫結到某一物件返回,這裡是doc
doc.AddMember("data", a1, a);
}
//在doc建立陣列
void test02(){
rapidjson::Document doc;
RapidCreateArr(doc);
std::string str= GetStrWithDoc(doc);
std::cout<< str <<std::endl;
}
執行上面程式結果如下:
2 陣列的遍歷
陣列的遍歷有三種,第一種是利用內部SizeType(實際為uint)型別的下標;第二種是利用迭代器;第三種是利用C++11新特性auto。建立陣列的函式RapidCreateArr上面已經有了,所以下面不再拷貝了。
1)SizeType下標遍歷。
//陣列的遍歷-下標
void test03(){
rapidjson::Document doc;
RapidCreateArr(doc);
//利用上面的函式建立陣列後,就可以進行遍歷
//1 先判斷data成員是否存在並且要求為陣列型別
if(!(doc.HasMember("data") && doc["data"].IsArray())){
std::cout << "陣列data不存在或者data不是陣列型別" << std::endl;
return;
}
//2 開始遍歷
const Value &a1 = doc["data"];//先獲取陣列
for(SizeType i = 0; i < a1.Size(); i++){
if(a1[i].IsInt()){
//一般這裡會再與自己的資料比較然後作業務處理
std::cout << a1[i].GetInt() << " ";
}
else if(a1[i].IsString()){
std::cout << a1[i].GetString() <<" ";
}else{
//其它型別按照這樣判斷即可
}
}
std::cout<<std::endl;
}
2)迭代器的遍歷。
//陣列的遍歷-迭代器
void test04(){
rapidjson::Document doc;
RapidCreateArr(doc);
//利用上面的函式建立陣列後,就可以進行遍歷
//1 先判斷data成員是否存在並且要求為陣列型別
if(!(doc.HasMember("data") && doc["data"].IsArray())){
std::cout << "陣列data不存在或者data不是陣列型別" << std::endl;
return;
}
//2 開始遍歷
const Value &a1 = doc["data"];//先獲取陣列
//Value::ConstValueIterator為通用Value型別的迭代器
for (Value::ConstValueIterator it = a1.Begin(); it != a1.End(); it++){
if(it->IsInt()){
std::cout << it->GetInt()<< " ";
}else if(it->IsString()){
std::cout << it->GetString() << " ";
}else{
//
}
}
std::cout<<std::endl;
}
3)C++11新特性。
//陣列的遍歷-C++11新特性
void test05(){
rapidjson::Document doc;
RapidCreateArr(doc);
//利用上面的函式建立陣列後,就可以進行遍歷
//1 先判斷data成員是否存在並且要求為陣列型別
if(!(doc.HasMember("data") && doc["data"].IsArray())){
std::cout << "陣列data不存在或者data不是陣列型別" << std::endl;
return;
}
//2 開始遍歷
const Value &a1 = doc["data"];//先獲取陣列
//x的值為a陣列依次的元素,注意x必須獲取的是引用,這就是rapid高效的地方,基本不支援拷貝賦值
for(auto &x:a1.GetArray()){
if(x.IsInt()){
std::cout << x.GetInt()<< " ";
}else if(x.IsString()){
std::cout << x.GetString() << " ";
}else{
//
}
}
std::cout<<std::endl;
}
主函式很簡單,順便也列一下吧。
int main(){
//test01();
//test02();
//test03();
//test04();
test05();
return 0;
}
上面3種遍歷後的結果都是一樣的:
搞定rapidjson的陣列建立,很簡單,容易出錯的地方在rapidjson第一節初始化已經總結了。我們建立陣列只需要注意上面的概述即可,即不能直接返回陣列。
下一節將講述kObjectType的建立與遍歷。