今天我们来学习一下关于比较复杂的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解析。