JSON文件使用
Cocos2d-x 3.x 加入了 rapidjson庫,用於Json解析。位於external/json下。
Json文件格式必須爲UTF8無BOM格式編碼,不然遊戲中會出現亂碼。
只支持標準的Json格式,一些非標準的Json格式不支持。一些常用的解析方法需要自己封裝。注意判斷解析節點是否存在。
PS:解析的Json文件,根節點必須爲對象、或數組。不然無法解析。
只支持標準的Json格式,一些非標準的Json格式不支持。一些常用的解析方法需要自己封裝。注意判斷解析節點是否存在。
PS:解析的Json文件,根節點必須爲對象、或數組。不然無法解析。
1、添加頭文件
如果只用於解析Json文件,只要前2行的頭文件即可。
Json對象解析使用:
如果只用於解析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數據加載成內存數據的過程。