C++ rapidjson使用示例
阿新 • • 發佈:2019-01-05
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 {}
}
}