原文地址:http://blog.csdn.net/cloud95/article/details/27643917
cocos2dx 2.2.x 版本以后,使用rapidjson进行数据解析,因为的效率要高写,下面是一个解析事例:
ball.json 数据如下:
- {
- "entities": [
- {
- "entity": {
- "TapOpposite": 0,
- "Interval": 0.95,
- "BallNum": 1
- }
- },
- {
- "entity": {
- "TapOpposite": 0,
- "Interval": 0.91,
- "BallNum": 2
- }
- },
- {
- "entity": {
- "TapOpposite": 0,
- "Interval": 0.95,
- "BallNum": 3
- }
- }
- ]
- }
在cocos2dx中json的读取是用的rapidjson,包含在libExtensions的CocoStudio的Json下:
所以在使用前我们需要引用命名空间和头文件:
#include "cocos-ext.h"
USING_NS_CC_EXT;
using namespace rapidjson;
- void GameWorld::readJson()
- {
- //json 文档
- rapidjson::Document _doc;
- bool bRet = false;
- unsigned long size = 0;
- unsigned char *pBytes = NULL;
- do {
- pBytes = cocos2d::CCFileUtils::sharedFileUtils()->getFileData("ball.json", "r", &size);
- CC_BREAK_IF(pBytes == NULL || strcmp((char*)pBytes, "") == 0);
- std::string load_str((const char*)pBytes, size);
- CC_SAFE_DELETE_ARRAY(pBytes);
- _doc.Parse<0>(load_str.c_str());
- CC_BREAK_IF(_doc.HasParseError());
- //生成json文档对像
- if(!_doc.IsObject())
- return;
- //是否有此成员
- if(!_doc.HasMember("entities"))
- return;
- // 通过[]取成员值,再根据需要转为array,int,double,string
- const rapidjson::Value &pArray = _doc["entities"];
- //是否是数组
- if(!pArray.IsArray())
- return;
- for (rapidjson::SizeType i = 0; i < pArray.Size(); i++)
- {
- const rapidjson::Value &p = pArray[i];
- if(p.HasMember("entity"))
- {
- const rapidjson::Value &valueEnt = p["entity"];
- if(valueEnt.HasMember("TapOpposite") && valueEnt.HasMember("Interval") && valueEnt.HasMember("BallNum"))
- {
- const rapidjson::Value &tapOpposite = valueEnt["TapOpposite"];
- int tapOp = tapOpposite.GetInt(); //得到int值
- const rapidjson::Value &interval = valueEnt["Interval"];
- float inter = interval.GetDouble(); //得到float,double值
- const rapidjson::Value &ballNum = valueEnt["BallNum"];
- int ball = ballNum.GetInt(); //得到int值
- }
- }
- else
- {
- return;
- }
- }
- bRet = true;
- } while (0);
- }