Cocos2d-x3.1 Json解析


#include "json/document.h"  


rapidjson::Document d1;   
 std::string jsonpath = FileUtils::getInstance()->fullPathForFilename(gate.c_str());
 std::string contentStr = FileUtils::getInstance()->getStringFromFile(jsonpath);
 d1.Parse<0>(contentStr.c_str());  int tag = 0;
std::string path = ""; 
const char *className = DICTOOL->getStringValue_json(d1, "classname");
    if(strcmp(className, "CCNode") == 0)
    {
	
		int count = DICTOOL->getArrayCount_json(d1, "gameobjects");
		 for (int i = 0; i < count; i++)
        {
            const rapidjson::Value &subDict = DICTOOL->getSubDictionary_json(d1, "gameobjects", i);
            if (!DICTOOL->checkObjectExist_json(subDict))
            {
                break;
            }
            
            const char *comName = DICTOOL->getStringValue_json(subDict, "classname");
			tag = DICTOOL->getIntValue_json(subDict, "objecttag");
			if(tag == Json_root  ){
                float x = DICTOOL->getFloatValue_json(subDict, "x");
                float y = DICTOOL->getFloatValue_json(subDict, "y");
                Point rooxy = Point(x,y);
                this->gateEdit(tag, subDict,  rooxy);
				int countj = DICTOOL->getArrayCount_json(subDict, "gameobjects");
				for (int j=0; j < countj; j++){
					const rapidjson::Value &subDictnode = DICTOOL->getSubDictionary_json(subDict, "gameobjects", j);
					if (!DICTOOL->checkObjectExist_json(subDictnode))
					{
						break;
					}
                    tag = DICTOOL->getIntValue_json(subDictnode, "objecttag");
                    this->gateEdit(tag, subDictnode,rooxy);

				}
				

			}
			
        }


	}




{
    "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
            }
        }
    ]
}



void GameWorld::readJson()
{
	//json 文档
	rapidjson::Document _doc;
	bool bRet = false;
	ssize_t 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值

					ballParam param;
					param.tapOp = tapOp;
					param.inter = inter;
					param.ballIndex = ball;
					m_ballParamVec.push_back(param);
				}
			}
			else
			{
				return;
			}

		}
		bRet = true;

	} while (0);
}



你可能感兴趣的:(Cocos2d-x3.1 Json解析)