Cocos2d-X 学习笔记 17 Cocos2dx Jason数据解析

首先了JSON相关知识:

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

JSON 官网地址: http://json.org

常用的几个版本包括C, C++, C#, Java, JavaScript, Perl, Python等

那么针对cocos2dx 我们应该使用c++的版本~

第一步: 下载cpp版本的json

 http://vdisk.weibo.com/s/yZxRoLm4SZZDD (Himi 微盘)

第二步: 解压文件夹放置项目中即可使用

?
1
#include "jsoncpp/include/json/json.h"

第三步:常用示例

3.1   先熟悉几个类名和函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
     /*
      Value:写过脚本、弱语言的童鞋应该很清楚var,其他Value 和var一个道理,都是可以表示很多数据类型的数据类型,。
          这话可能比较绕,简单说就是Value你可以理解可以是int 也可以是string 也可以是其他数据类型。
          当然定义 Value value,只是个定义,还没有决定其数据类型,如果你Value value =10;那么value 就是个整型
          在用于JSON时,我们常表示为一个map,其中包括 key-value,键值对
  
      其中Value 中包括一些将其转为基础数据类型的6个方法,如下:
          value.asCString();
          value.asString();
          value.asBool();
          value.asDouble();
          value.asInt();
          value.asUInt();
      */
Json::FastWriter write;
     /*
      FastWriter:起作用是将Value数据编码成JSON格式的数据
      常用函数:write(< #const Json::Value &root#>)
      */
Json::Reader reader;
     /*
      Value:作用与FastWriter相反,是将JSON格式的数据解析成一个Value
      常用函数: reader.parse(< #std::istream &is#>, < #Json::Value &root#>)
      */

 

以上是常用的类和函数已经注释说明的很清楚了,那么下面我们开始进行制作JSON数据、解析JSON数据等操作吧:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
     //创建JSON数据
  
     //------先定义数据
     Json::Value map;
     map[ "name" ]= "Himi" ;
     map[ "age" ]=23;
     //------编码成json数据
     string jsonData =write.write(map);
     CCLOG( "jsonData:%s" ,jsonData.c_str());
     //打印结果 Cocos2d: jsonData:{"age":23,"name":"Himi"}
  
     //解析JSON数据
     //--先将数据解析到 Value(parseData)中
     Json::Value parseData;
     reader.parse(jsonData, parseData);
  
     Json::Value valueName = "默认" ;
     Json::Value valueAge = -1;
     valueName = parseData.get( "name" , valueName);
     valueAge = parseData.get( "age" , valueAge);
  
     const char * nameStr =valueName.asCString() ;
     int age = valueAge.asInt();
     CCLOG( "name:%s,age:%d" ,nameStr,age);
     //打印结果:Cocos2d: name:Himi,age:23
  
     //使用get函数时,第一个参数是key的名, 第二个参数是如果找不到对应key的默认Value
     //举例我们将name和age,故意写错:
  
//    Json::Value parseData;
//    reader.parse(jsonData, parseData);
//   
//    Json::Value valueName = "默认";
//    Json::Value valueAge = -1;
//    valueName = parseData.get("nameHimi", valueName);
//    valueAge = parseData.get("ageHimi", valueAge);
//   
//    const char* nameStr =valueName.asCString() ;
//    int age = valueAge.asInt();
//    CCLOG("name:%s,age:%d",nameStr,age);
     //打印结果:Cocos2d: name:默认,age:-1
  
     //复杂一点JSON的编写和解析
     Json::Value root;
     Json::Value array;
     array[ "arrKey1" ]= "arrValue1" ;
     array[ "arrKey2" ]= "arrValue2" ;
     array[ "arrKey3" ]= "arrValue3" ;
     root[ "arrayKey" ] =array;
     string hJsonData = write.write(root);
     CCLOG( "复杂一点的JSON格式数据:%s" ,hJsonData.c_str());
     //打印结果 Cocos2d: 复杂一点的JSON格式数据:{"arrayKey":{"arrKey1":"arrValue1","arrKey2":"arrValue2","arrKey3":"arrValue3"}}
  
     Json::Value parseRoot;
     Json::Value parseArray;
     reader.parse(hJsonData, parseRoot);
     parseArray = parseRoot.get( "arrayKey" , parseArray);
  
     CCLOG( "解析出的数据:%s,%s,%s" ,
           parseArray.get( "arrKey1" ,NULL).asCString(),
           parseArray.get( "arrKey2" ,NULL).asCString(),
           parseArray.get( "arrKey3" ,NULL).asCString());
     //打印结果:Cocos2d: 解析出的数据:arrValue1,arrValue2,arrValue3

 

整体来说JSON CPP 还是很非常好用的,就不多扯了~ 再复杂的数据只要会了如上,基本就全OK;

需要注意的两点:

1. 使用Value的get函数时,如果你传入第二个参数(默认Value),那么一定要将获得的结果赋值给第二个参数,防止get函数找到对应Key时,Value没人要的问题发生。如下:

Json::Value value;

value = xx .get(“key”,value);

当然你很确定key,你也可以:

Value value = xx .get(“key”,NULL);

2.使用get获取的value,一定要注意其数据类型,不要获取的是个整型,还要使用asCString()函数转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值