Cocos2d-x教程 -Json解析(高级篇)

19 篇文章 0 订阅
1 篇文章 0 订阅

转自 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格式转换成一个Value

Reader 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解析。


——————————————————————————————————————

另外,可以用下面的方法遍历

CSJson::Reader read;
CSJson::Value myjson = readJson("jsontest.json");//利用上面的函数生成一个json。 
string name;
int i=0;
//这里为遍历整个jsonvalue的值
for(CSJson::ValueIterator a=myjson.begin(); a!=myjson.end(); ++a) {
     
    CSJson::Value value=(CSJson::Value)*a;
    name=value["Tollgate"].asString();
    CCLOG("myjson:%s",name.c_str());

    //两种打印方式,可以选择上面字符是我的字段
    name=myjson[i]["Tollgate"].asString();
    CCLOG("myjson:%s",name.c_str());
    i++;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值