歡迎加入 Cocos2d-x 交流羣: 193411763
視頻教程地址: http://www.tudou.com/programs/view/nCNuA73mOLM/
轉載時請註明原文出處:http://blog.csdn.net/u012945598/article/details/17416531
需要源碼請留下郵箱地址
今天我們來學習一下關於比較複雜的Json數據的解析方法。
在上一節中已經說明,2.2.0以上版本的2d-x已經包含了老版本中我們所使用的jsoncpp的文件,所以我們可以直接使用無需引入任何庫。下面進入正題....
在製作遊戲的過程中,有很多關於遊戲的信息實際上是保存在文件中的,舉個例子來說,一款遊戲的戰鬥模塊,它的關卡設計需要很多的數據,比如某一關怪物的數量,怪物的刷新時間等等,這些數據都可以保存在文件中,在需要的時候通過某些方法來讀取。.json是我們常用的一種格式,下面我們首先來寫一個json文件
{
"Tollgate": [
{
"Type1": {
"RefreshTime": 0.5,
"Count": 100
},
"Type2": {
"RefreshTime": 5,
"Count": 2
}
},
{
"Type1": {
"RefreshTime": 0.5,
"Count": 120
},
"Type2": {
"RefreshTime": 5,
"Count": 2
}
}
]
}
這是筆者剛剛寫的一個json文件,我們來分析一下它的結構,處於最外層的是 “Tollgate”:[ ] ,Tollgate 代表的是關卡,可以這個鍵所對應的值是一個數組,我們可以看到數組內包含了兩個元素[ { },{ } ], ,事實上這兩個元素單獨拿出來後又是一個Json格式的數據,也是OC中所說的詞典,這兩個元素在數組中被默認爲第0個元素與第1個元素,此處筆者將第0個元素定義爲第1關,將第1個元素定義爲第2關;第一關中又包含了兩個鍵值對,第一個鍵是"Type1",第二個鍵是"Type2",分別代表兩種怪物類型,而每個Type對應的值又是一個詞典{ },詞典內又包含了兩個鍵值對,分別是"RefreshTime"和"Count",代表怪物的刷新時間與怪物的總數。
下面我們來看一下如何在程序中如何獲取到這些數據,新建一個工程,將json文件放到工程目錄下,頭文件及命名空間不要忘記添加。
1.首先要獲取Json文件內的全部數據:
unsigned long size;
const char* file = (char*)CCFileUtils::sharedFileUtils()->getFileData("child.json","r", &size);
通過打印該字符指針 file 我們會在控制檯看到Json文件的全部內容
2.通過Reader的parse方法將Json格式轉換成一個ValueReader reader;
Value root;
reader.parse(std::string(file),root,false);
3.獲取到Value中的Tollgate所對應的Value,也就是一個數組
Value array;
array=root.get("Tollgate",NULL);
get函數的第二個參數代表找不到Tollgate對應的Value時的默認Value
4.數組中共有兩個元素,我們現在獲取第一個元素中的Type1中,Count所對應的Value
Value count;
count=array[0]["Type1"].get("Count",NULL);
5.此時的count是一個Value類型,我們需要將其轉換爲整型,然後輸出
CCLOG("%d",count.asInt());
輸出後可運行看到結果爲100。
這就是解析Json文件的全過程,我們會覺得有些繁瑣,下面筆者將這個過程做一個簡單的封裝。
新建一個類,筆者命名爲AnalysisJson,.h文件中代碼如下:
.cpp文件代碼如下:
在HelloWorld中引入AnalysisJson頭文件,然後創建一個對象,並調用獲取怪物刷新時間與數量的方法:
運行項目控制檯輸出結果:
這樣便完成了一個Json解析。