以前是一直使用CCJsonConventer去把JSON字符串转化为CCDictionary对象的,现在使用cocos2d-x 3.x后,不推荐使用CCDictionary了,而且,JSON库也换成了rapidjson,不过我暂时没找到好的封装,如果仅仅是用作数据提取的话,做几个宏定义就可以达到目的了。
/* * ===================================================================================== * * Filename: RapidJsonMacro.h * * Description: Easy macro to operate RapidJSON * * Version: 1.0 * Created: 12/26/2014 11:38:23 * Revision: none * Compiler: gcc * * Author: Jason Tou (),sosoayaen@gmail.com * Organization: * * ===================================================================================== */ #pragma once #include "json/rapidjson.h" #include "json/document.h" // 基础变量的校验 #define json_check_is_bool(value,strKey) (value.HasMember(strKey) && value[strKey].IsBool()) #define json_check_is_string(value,strKey) (value.HasMember(strKey) && value[strKey].IsString()) #define json_check_is_int32(value,strKey) (value.HasMember(strKey) && value[strKey].IsInt()) #define json_check_is_uint32(value,strKey) (value.HasMember(strKey) && value[strKey].IsUint()) #define json_check_is_int64(value,strKey) (value.HasMember(strKey) && value[strKey].IsInt64()) #define json_check_is_uint64(value,strKey) (value.HasMember(strKey) && value[strKey].IsUint64()) #define json_check_is_float(value,strKey) (value.HasMember(strKey) && value[strKey].IsFloat()) #define json_check_is_double(value,strKey) (value.HasMember(strKey) && value[strKey].IsDouble()) #define json_check_is_number(value,strKey) (value.HasMember(strKey) && value[strKey].IsNumber()) #define json_check_is_array(value,strKey) (value.HasMember(strKey) && value[strKey].IsArray()) // 得到对应类型的数据,如果数据不存在则得到一个默认值 #define json_check_bool(value,strKey) (json_check_is_bool(value,strKey) && value[strKey].GetBool()) #define json_check_string(value,strKey) (json_check_is_string(value,strKey) ? value[strKey].GetString() : "") #define json_check_int32(value,strKey) (json_check_is_int32(value,strKey) ? value[strKey].GetInt() : 0) #define json_check_uint32(value,strKey) (json_check_is_uint32(value,strKey) ? value[strKey].GetUint() : 0) #define json_check_int64(value,strKey) (json_check_is_int64(value,strKey) ? ((value)[strKey]).GetInt64() : 0) #define json_check_uint64(value,strKey) (json_check_is_uint64(value,strKey) ? ((value)[strKey]).GetUint64() : 0) #define json_check_float(value,strKey) (json_check_is_float(value,strKey) ? ((value)[strKey]).GetFloat() : 0) #define json_check_double(value,strKey) (json_check_is_double(value,strKey) ? ((value)[strKey]).GetDouble() : 0) // 得到Value指针 #define json_check_value_ptr(value,strKey) (((value).HasMember(strKey)) ? &((value)[strKey]) : nullptr)
使用上也比较简单,比如获取一个字符串:
void getName(const rapidjson::Value& data) { std::string strName = json_check_string(data,"name"); }不过这里仅仅是罗列了只读数据的操作,写操作还没搞,貌似json数据在客户端还是解析的操作比较多,以后用到再总结吧