項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【C++】C++ rapidjson 使用範例,產生 json 檔案的範本 cpp json template (內含範例程式碼) sample code

前言

json 算是檔案與檔案溝通之間,非常經常使用的格式,
由於非常經常使用,我們將 json 製作檔案的格式紀錄下來,
供之後反覆使用方便。

範例程式碼

以下我們先分開說明每一種資料型態在 C++ rapidjson 處理的方式,
最後再整合起來,用一支程式進行全部的示範。

處理基本資料型態 (bool, int, double, string)

寫入 json (基本資料型態 bool, int, double, string)

Document json_content;
Document::AllocatorType& allocator = json_content.GetAllocator();
json_content.SetObject();

// set string, int, bool
json_content.AddMember("key1", "value1", allocator); // char*
// json_content.AddMember("key1", Value().SetString("value1".c_str(), allocator), allocator); // string
json_content.AddMember("key2", 10, allocator); // int
json_content.AddMember("key3", true, allocator); // bool

從 json 讀取 (基本資料型態 bool, int, double, string)

Document document; // Object (python dict)
document.Parse(json_content.str().c_str());

cout << "[Reading json content] document[key1] = " << document["key1"].GetString() << endl;
cout << "[Reading json content] document[key2] = " << document["key2"].GetInt() << endl;
cout << "[Reading json content] document[key3] = " << document["key3"].GetBool() << endl;

處理進階資料結構 – 1D Array (Python list)

這裡註記 Python list 的原因是因為作者本身是從 Python 學過來的XD,
由於資料結構命名不同,但指的是同樣的東西,因此在這邊做一些筆記。

寫入 json (1D Array)

// set array (python list)
// 1D array
Value oneDimArray(kArrayType);
for(int i = 0 ; i < 5; i++)
{   
    oneDimArray.PushBack(i, allocator);
}
json_content.AddMember("key4", oneDimArray, allocator);

從 json 讀取 (1D Array)

Value &value4 = document["key4"]; // array
assert(value4.IsArray() && "assertion error, value4 is not Array");
cout << "[Reading json content] document[key4] = " << endl;
cout << "[" ;
for(SizeType i = 0; i < value4.Size(); i++){
    if(i < value4.Size() - 1)
        cout << value4[i].GetInt() << ",";
    else
        cout << value4[i].GetInt() << "]\n";  
}

處理進階資料結構 – 2D Array (Python list)

這裡註記 Python list 的原因是因為作者本身是從 Python 學過來的XD,
由於資料結構命名不同,但指的是同樣的東西,因此在這邊做一些筆記。

寫入 json (2D Array)

// set Value array (python list)
// 2D array
Value secondDimArray(kArrayType);
for(int j = 0 ; j < 5; j++){
    Value firstDimArray(kArrayType);
    for(int i = 0 ; i < 5; i++){   
        firstDimArray.PushBack(j*5+i, allocator);
    }
    secondDimArray.PushBack(firstDimArray, allocator);
}

json_content.AddMember("key5", secondDimArray, allocator);

從 json 讀取 (2D Array)

void printOneDimArray(Value &arr){
assert(arr.IsArray() && "assertion error, arr is not Array");
    cout << "[" ;
    for(SizeType i = 0; i < arr.Size(); i++){
        if(i < arr.Size() - 1)
            cout << arr[i].GetInt() << ",";
        else
            cout << arr[i].GetInt() << "]";  
    }
}

// read  2D array
cout << "[Reading json content] document[key5] = " << endl;
Value &value5 = document["key5"]; // array
cout << "[Reading json content] Get type of document[key5] = " << kTypeNames[document["key5"].GetType()] << endl; // kTypeNames[itr->value.GetType()]);
assert(value5.IsArray() && "assertion error, value