JSON是一种轻量级的数据交换格式,它对开发过程中,给我们处理数据带来了极大的方便,因此这里我们将会来学习JSON在cocos2d-x中的使用方法!
【转载自专家Himi】:http://blog.csdn.net/xiaominghimi/article/details/14524645
首先了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 先熟悉几个类名和函数:
/* 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数据等操作吧:
//创建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()函数转换。