Cocos2d-x中Jsonrapidjson的扩展

容我直接上代码

/**
	*  保存Json文件
	*
	*  @param fileName 文件名
	*  @param doc      Json对象
	*
	*  @return 是否保存成功
	*/
	static bool saveJsonFile(const char *fileName,rapidjson::Document &doc) {
		bool bRet = false;
		do {
			//LS_LOG("file path : %s",fileName);

			rapidjson::StringBuffer buffer;
			rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
			doc.Accept(writer);
			std::string str = buffer.GetString();

			FILE *fp = std::fopen(lsStandardPath(fileName).c_str(),"wb");
			CCASSERT(fp != nullptr,"file open error");
			//fwrite(str.c_str(),str.length(),1,fp);
			fputs(str.c_str(),fp);
			fclose(fp);
			bRet = true;
		} while (0);
		return bRet;
	}

	/**
	*  删除Json数组的某一个对象
	*
	*  @param index 第几个
	*  @param value Json对象
	*
	*  @return 是否读取成功
	*/
	static bool removeJsonArrayItem(int index,rapidjson::Value &value) {
		bool bRet = false;
		int size = value.Size();
		if (index < size) {
			for (unsigned int i = index; i + 1 < value.Size(); i++)
				value[i] = value[i + 1];
			value.PopBack();
			bRet = true;
		}
		return bRet;
	}

	/**
	*  将char*转成Json对象
	*
	*  @param str 要转换的字符
	*  @param doc 转换后的Json对象
	*
	*  @return 是否转换成功
	*/
	static bool readJsonWithString(const char *str,rapidjson::Document &doc) {
		bool bRet = false;
		do {
			std::string content(str);
			replaceString(content,":null",":\"\"");
			doc.Parse<0>(content.c_str());
			CCASSERT(!doc.HasParseError(),"HasParseError");
			bRet = true;
		} while (0);
		return bRet;
	}

	/**
	*  读取Json文件
	*
	*  @param fileName 文件名
	*  @param doc      转换后的Json对象
	*
	*  @return 是否读取成功
	*/
	static bool readJsonWithFile(const char *fileName,rapidjson::Document &doc) {
		bool bRet = false;
		if (cocos2d::FileUtils::getInstance()->isFileExist(fileName)) {
			std::string contentStr = cocos2d::FileUtils::getInstance()->getStringFromFile(fileName);
			//LS_LOG("%s connent:%s",fileName,contentStr.c_str());
			bRet = readJsonWithString(contentStr.c_str(),doc);
		}

		return bRet;
	}

	/**
	*  将json的Value转成String
	*
	*  @param node   Json格式的Value
	*  @param strret 转换后的String
	*
	*  @return 0表示成功,-1表示失败
	*/
	static int valueToString(const rapidjson::Value &node,std::string &strret) {
		strret.clear();
		char tmp[64] = { 0 };
		if (node.IsString()) {
			strret = node.GetString();
			return 0;
		}
		else if (node.IsDouble()) {
			//sprintf_s(tmp,63,"%.2lf",node.GetDouble());
			sprintf(tmp,node.GetDouble());
			strret = tmp;
			return 0;
		}
		else if (node.IsNumber()) {
			sprintf(tmp,"%.0lf",node.GetDouble());
			strret = tmp;
			return 0;
		}
		else if (node.IsFalse()) {
			strret = "false";
			return 0;
		}
		else if (node.IsTrue()) {
			strret = "true";
			return 0;
		}
		return -1;
	}
	/**
	*  查找Json数据中的值
	*
	*  @param node  Json格式的Value
	*  @param key	 关键字
	*  @param value 值
	*
	*  @return -1表示失败,其他情况表示数组中第几个
	*/
	static int getIndexWithJsonArray(rapidjson::Value &node,const char *key,const char *value) {
		int index = -1;
		if (node.IsArray()) {
			for (unsigned int i = 0; i < node.Size(); i++) {
				//const char* temp = node[i][key].GetString();
				//LS_LOG("%s%s",value,temp);
				if (strcmp(value,node[i][key].GetString()) == 0) {
					index = i;
					break;
				}
			}
		}
		CCASSERT(index != -1,"not find value in array");
		return index;
	}

	static void sortJsonArray(rapidjson::Value &node,bool isAsc = true) {
		CCASSERT(node.IsArray(),"is not array");
		rapidjson::Value temp;
		int dir = isAsc ? 1 : -1;
		for (unsigned int j = 0; j < node.Size(); j++)
			for (unsigned int i = 0; i < node.Size() - 1; i++) {
				CCASSERT(node[i].HasMember(key),"not member");
				CCASSERT(node[i][key].IsInt(),"not int");
				if (dir * node[i][key].GetInt() > dir * node[i + 1][key].GetInt()) {
					temp = node[i];
					node[i] = node[i + 1];
					node[i + 1] = temp;
				}
			}
	}

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...