1. 程式人生 > 其它 >02rapidJson學習之陣列的建立、遍歷

02rapidJson學習之陣列的建立、遍歷

技術標籤:c++json

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的建立與遍歷。