1. 程式人生 > >C++ rapidjson使用示例

C++ rapidjson使用示例

rapidjson使用示例

文章目錄


如果想深入學習rapidjson工具, 官方文件肯定是必須看一看的

本示例所用環境

引擎版本:cocos2d-x 3.10

示例程式碼與註釋

說明:我是直接使用原本引擎建立了新的cocos2dx工程,然後略微修改了HelloWorldScene.cpp中的程式碼。為了方便,使用rapidjson生成json串,儲存json串到檔案,從檔案讀取json串,使用rapidjson解析json串的過程,全部寫到了initSelf()函式中。

HelloWorldScene.h檔案內容

#include "cocos2d.h" 
class HelloWorld : public cocos2d::Layer
{
public:
	static cocos2d::Scene* createScene();
	virtual bool init();
	CREATE_FUNC(HelloWorld);
private:
	void initSelf();
}

HelloWorldScene.cpp檔案的內容

#include "HeeloWorldScene.h"

#include "json/rapidjson.h"
#include "json/document.h" #include "json/filestream.h" #include "json/stringbuffer.h" #include "json/writer.h" USING_NS_CC; Scene* HelloWorld::CreateScene() { auto scene = Scene::create(); auto layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init() { if
( !Layer::init() ) { return false; } else { this->initSelf(); return true; } } // 重點 void HelloWorld::initSelf() { //生成一串如下的json格式字串,並解析 // { // "name":"king", // "age":20, // "letter":["a","b","c"], // "location": {"province":"shannxi","city":"xian","number":16} // "book":[{"name":"book1", "isbn":"123"},{"name":"book2","isbn":"456"}], // "healthy":true, // } // 生成json串 rapidjson::Document jsonDoc; // 生成一個dom元素的Document rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); // 獲取分配器 jsonDoc.SetObject(); // 將當前的Document設定為一個object,也就是說整個Document是一個Object型別的dom元素 // 新增屬性 jsonDoc.AddMember("name","king",allocator); // 新增字串值 jsonDoc.AddMember("age",20,allocator); // 新增int型別值 // 生成array rapidjso::Value letterArray(rapidjson::kArrayType); // 建立一個Array型別的元素 letterArray.PushBack("a",allocator); letterArray.PushBack("b",allocator); letterArray.PushBack("c",allocator); jsonDoc.AddMember("letter",letterArray,allocator); // 生成一個object rapidjson::Value locationObj(rapidjson::kObjectType); // 建立一個Object型別的元素 locationObj.AddMember("province","shannxi",allocator); locationObj.AddMember("city","xian",allocator); locationObj.AddMember("number",16,allocator); jsonDoc.AddMember("location",locationObj,allocator); // 生成一個Object陣列 rapidjson::Value bookArray(rapidjson::kArrayType); // 定義陣列(存放Object) rapidjson::Value book1(rapidjson::kObjectType); // 生成book1 book1.AddMember("name","book1",allocator); book1.AddMember("isbn","123",allocator); bookArray.PushBack(book1,allocator); rapidjson::Value book2(rapidjson::kObjectType); // 生成book2 book2.AddMember("name","book2",allocator); book2.AddMember("isbn","456",allocator); bookArray.PushBack(book2,allocator); jsonDoc.AddMember("book",bookArray,allocator); // 新增屬性 jsonDoc.AddMember("healthy",true,allocator); // 新增bool型別值 // 生成字串 rapidjson::StringBuffer buffer; rapidjson::Write<rapidjson::StringBuffer> writer(buffer); jsonDoc.Accept(writer); std::string strJson = buffer.GetString(); log("---生成的Json:\n%s",strJson.c_str()); // 寫到檔案 std::string strPath = FileUtils::getInstance()->getWritablePath() + "JsonFile.txt"; FILE* fp = fopen(strPath.c_str(),"wb"); if (fp) fputs(buffer.GetString(),fp); fclose(fp); //JsonFile.txt檔案內容 //{"name":"qfl","age":20,"letter":["a","b","c"],"location":{"province":"fujian","city":"xiamen","number":16},"book":[{"name":"book1","isbn":"123"},{"name":"book2","isbn":"456"}],"healthy":true} log("---讀取json內容:") rapidjson::Document newDoc; fp = fopen(strPath.c_str(),"rb"); if (fp) { rapidjson::FileStream inputStream(fp); // 從檔案中建立一個輸入流 newDoc.ParseStream<0>(inputStream); // 將讀取的內容轉換為dom元素 fclose(fp); } //判斷解析從流中讀取的字串是否有錯誤 if (newDoc.HasParseError()) { log("Json Parse error:%d", newDoc.GetParseError()); //列印錯誤編號 } else { //獲取json串中的資料 //先判斷是否有這個欄位,如果使用不存在的key去取值會導致直接崩潰 if (newDoc.HasMember("name")) { log("name:%s", newDoc["name"].GetString()); //必須要獲取對應的資料型別,rapidjson不會幫你轉換型別 } else {} if (newDoc.HasMember("age")) { log("age:%d", newDoc["age"].GetInt()); //獲取正確的型別 } else {} if (newDoc.HasMember("letter")) { rapidjson::Value letter; //使用一個新的rapidjson::Value來存放array的內容 letter = newDoc["letter"]; //確保它是一個Array,而且有內容 if (letter.IsArray() && !letter.Empty()) { //遍歷Array中的內容 for (rapidjson::SizeType i = 0; i < letter.Size(); i++) { log("letter:%s", letter[i].GetString()); } } else {} } else {} if (newDoc.HasMember("location")) { rapidjson::Value location; //使用一個新的rapidjson::Value來存放object location = newDoc["location"]; //確保它是一個Object if (location.IsObject()) { if (location.HasMember("province")) { log("location:province:%s", location["province"].GetString()); } else {} if (location.HasMember("city")) { log("location:city:%s", location["city"].GetString()); } else {} if (location.HasMember("number")) { log("location:number:%d", location["number"].GetInt()); } else {} } else {} } else {} //book是一個包含了2個object的array。按照上面的步驟來取值就行 if (newDoc.HasMember("book")) { rapidjson::Value book; book = newDoc["book"]; //先取Array if (book.IsArray() && !book.Empty()) { rapidjson::Value tempBook; for (rapidjson::SizeType i = 0; i < book.Size(); i++) { tempBook = book[i]; //Array中每個元素又是一個Object if (tempBook.IsObject()) { if (tempBook.HasMember("name") && tempBook.HasMember("isbn")) { log("book:%d:name:%s, isbn:%s", i, tempBook["name"].GetString(), tempBook["isbn"].GetString()); } else {} } else {} } } else {} } else {} if (newDoc.HasMember("healthy")) { if (newDoc["healthy"].GetBool()) { log("healthy:true"); } else { log("healthy:false"); } } else {} } }