cocos2d-X:Json數據(2)

JSON文件使用

Cocos2d-x 3.x 加入了 rapidjson庫,用於Json解析。位於external/json下。
 Json文件格式必須爲UTF8無BOM格式編碼,不然遊戲中會出現亂碼。
只支持標準的Json格式,一些非標準的Json格式不支持。一些常用的解析方法需要自己封裝。注意判斷解析節點是否存在。
PS:解析的Json文件,根節點必須爲對象、或數組。不然無法解析。
1、添加頭文件

如果只用於解析Json文件,只要前2行的頭文件即可。
//
    #include "json/rapidjson.h"
    #include "json/document.h"
    #include "json/writer.h"
    #include "json/stringbuffer.h"
    //#include "json/filestream.h"
    //#include "json/prettywriter.h"
 
    using namespace rapidjson; // 命名空間
//<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">	</span>

2、Json數據解析
Cocos封裝的 rapidjson庫,只能解析對象格式、或數組格式的Json文件。

2.1、解析對象格式的Json
Json文件中的數據,根節點爲一個對象,所有屬性在大花括號 { } 中。
對象中的數據,通過 名稱/值 的形式進行訪問。
Json文件內容如下:

//
{
    "hello" : "world",
    "t"     : true,
    "f"     : false,
    "n"     : null,
    "i"     : 123,
    "pi"    : 3.1416,
    "array" : [1, 2, 3, 4],
    "object": {
        "name" : "alice",
        "age" : 23
    }
}
//

Json對象解析使用:
//
//[1] 讀取json文件內容
    std::string str = FileUtils::getInstance()->getStringFromFile("testJson.json");
    CCLOG("%s", str.c_str());
 
//[2] 創建用於處理json代碼的類
    // 創建rapidjson::Document類:用於操作json代碼
    rapidjson::Document d;
 
//[3] 解析json文件內容
    // 其中 rapidjson::kParseDefaultFlags = 0,默認方式
    d.Parse<rapidjson::kParseDefaultFlags>(str.c_str());
    // d.Parse<0>(str.c_str());  // 也可以直接寫<0>
 
//[4] 判斷解析是否出錯
    if (d.HasParseError()) {
        CCLOG("GetParseError %s\n",d.GetParseError());
        return;
    }
 
//[5] 獲取json中的數據
    // 判斷json文件是否爲對象格式
    if (d.IsObject()) {
 
        // 是否有 "hello" 屬性
        if (d.HasMember("hello")) {
            CCLOG("%s", d["hello"].GetString()); // 方式一:直接獲取
        }
        // 是否有 "i" 屬性
        if (d.HasMember("i")) {
            rapidjson::Value& i = d["i"];        // 方式二:保存爲rapidjson::Value&
            CCLOG("%d", i.GetInt());
        }
 
        // 數組
        if (d.HasMember("array")) {
            // 獲取數組中的元素:d["array"][i]
            for (int i = 0; i < d["array"].Size(); i++) {
                CCLOG("%d : %d", i, d["array"][i].GetInt());
            }
 
//            // 也可以這麼寫
//            rapidjson::Value& array = d["array"];
//            for (int i = 0; i < array.Size(); i++) {
//                CCLOG("%d : %d", i, array[i].GetInt());
//            }
        }
 
        // 對象
        if (d.HasMember("object")) {
            // 判斷 "object" 屬性對應的值,是否爲一個對象
            if (d["object"].IsObject()) {
                // 轉化爲 rapidjson::Value&
                rapidjson::Value& object = d["object"];
                CCLOG("%s", d["object"]["name"].GetString());
                CCLOG("%d", object["age"].GetInt());
            }
        }
    }
//
輸出結果:

2.2、解析數組格式的Json
Json文件中的數據,根節點爲一個數組,所有元素在一個大方括號 [ ] 中。
數組中的數據,通過下標的形式訪問元素值(下標從0開始)。
Json文件內容如下:

//
    [
        true,
        123,
        "888",
        "hello world",
        {"name" : "alice", "age" : 23},
        [1,2,3,4]
    ]
//
Json數組解析使用:
//
//[1] 讀取json文件內容
    std::string str = FileUtils::getInstance()->getStringFromFile("testJson.json");
    CCLOG("%s", str.c_str());
 
//[2] 創建用於處理json代碼的類
    // 創建rapidjson::Document類:用於操作json代碼
    rapidjson::Document d;
 
//[3] 解析json文件內容
    // 其中 rapidjson::kParseDefaultFlags = 0,默認方式
    d.Parse<rapidjson::kParseDefaultFlags>(str.c_str());
    // d.Parse<0>(str.c_str());  // 也可以直接寫<0>
 
//[4] 判斷解析是否出錯
    if (d.HasParseError()) {
        CCLOG("GetParseError %s\n",d.GetParseError());
        return;
    }
 
//[5] 獲取json中的數據
    // 判斷json文件是否爲數組格式
    if (d.IsArray()) {
         
        rapidjson::Value& array = d;
         
        for (int i = 0; i < array.Size(); i++) {
 
            if (d[i].IsBool()) {   // 邏輯值
                CCLOG("%d is Bool : %d", i, array[i].GetBool());
            }
            if (d[i].IsNumber()) { // 數字
                CCLOG("%d is Number : %d", i, array[i].GetInt());
            }
            if (d[i].IsString()) { // 字符串
                CCLOG("%d is String : %s", i, array[i].GetString());
            }
            if (d[i].IsObject()) { // 對象
                rapidjson::Value& object = d[i];
                CCLOG("%d is Object : %s", i, array[i]["name"].GetString());
                CCLOG("%d is Object : %d", i, object["age"].GetInt());
            }
            if (d[i].IsArray()) {  // 數組
                for (int j = 0; j < array[i].Size(); j++) {
                    CCLOG("[%d,%d] is Array : %d", i, j, array[i][j].GetInt());
                }
            }
        }
    }
//
輸出結果:

其實用起來可不必這麼麻煩,如果對自己的Json文件相當熟悉,可以不需要那麼多判斷 直接使用就好。

下面是我寫RPG遊戲時的Json數據加載,因爲這個Json是我自己設計的,相當的熟悉,所以我也就直接拿來用了:

void DataLoad::getNpc()
{
	//[1] 讀取json文件內容
	std::string str = FileUtils::getInstance()->getStringFromFile("Npc.json");
	//CCLOG("%s", str.c_str());

	//[2] 創建用於處理json代碼的類
	rapidjson::Document d;

	//[3] 解析json文件內容
	d.Parse<rapidjson::kParseDefaultFlags>(str.c_str());
	//數組內容加載
	int len = d.Size();
	for (int i = 0; i < len; i++) {
		NpcObject* Npc = new NpcObject();
		Npc->NpcID = d[i]["id"].GetInt();
		Npc->NpcPic = d[i]["NpcURL"].GetString();
		Npc->NpcName = d[i]["NpcName"].GetString();
		Npc->setNpcX = d[i]["X"].GetInt();
		Npc->setNpcY = d[i]["Y"].GetInt();
		Npc->NpcLines = d[i]["dialogue"].GetString();
		Npc->type = d[i]["type"].GetInt();
		npcVec.push_back(Npc);
	}
}
上面就是一個把Json數據加載成內存數據的過程。

發佈了50 篇原創文章 · 獲贊 39 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章