cocos2dx 3.X 中 json 文件生成与读取
Cocos2d-x 3.0 加入了rapidjson库用于json解析。位于项目的cocos2d/external/json下。
rapidjson 是一个不需要包含 .lib 和 .dll 即可运行的可见代码库。项目 wiki 见这里。下面通过两个实例来深入了解它在 cocos2dx 中的用法。
生成JSON文件并保存
#include "CCStdC.h" #include "cocos2d.h" #include "json/document.h" #include "json/writer.h" #include "json/stringbuffer.h" using namespace rapidjson; USING_NS_CC; int main() { //*** 生成 json 文件,存储在 getWritablePath 文件夹下 *** rapidjson::Document writedoc; writedoc.SetObject(); rapidjson::Document::AllocatorType& allocator = writedoc.GetAllocator(); rapidjson::Value array(rapidjson::kArrayType); rapidjson::Value object(rapidjson::kObjectType); // json object 格式添加 “名称/值” 对 object.AddMember("inttag", 1, allocator); object.AddMember("doubletag", 1.0, allocator); object.AddMember("booltag", true, allocator); object.AddMember("hellotag", "helloworld", allocator); // json 加入数组 array.PushBack(object, allocator); // json object 格式添加 “名称/值” 对 writedoc.AddMember("json", "json string", allocator); writedoc.AddMember("array", array, allocator); StringBuffer buffer; rapidjson::Writer<StringBuffer> writer(buffer); writedoc.Accept(writer); auto path = FileUtils::getInstance()->getWritablePath(); path.append("myhero.json"); FILE* file = fopen(path.c_str(), "wb"); if(file) { fputs(buffer.GetString(), file); fclose(file); } CCLOG("%s",buffer.GetString()); return 0; }
我是用 VS2012 编译的,最终生成的json文件位于 \proj.win32\Debug.win32 文件夹下。打开内容如下:
{"json":"json string","array":[{"inttag":1,"doubletag":1,"booltag":true,"hellotag":"helloworld"}]}
读取JSON文件并显示
rapidjson 需要根据原 json 格式单独编写解析方法,因此根据以上生成方法,解析方法应该为:
#include "CCStdC.h" #include "cocos2d.h" #include "json/document.h" #include "json/writer.h" #include "json/stringbuffer.h" using namespace rapidjson; USING_NS_CC; int main() { auto path = FileUtils::getInstance()->getWritablePath(); path.append("myhero.json"); //*** 读取 json 文件 *** rapidjson::Document readdoc; bool bRet = false; ssize_t size = 0; std::string load_str; // getFileData 如果不指定,读取根目录是 Resource 文件夹 unsigned char* titlech = FileUtils::getInstance()->getFileData(path, "r", &size); load_str = std::string((const char*)titlech,size); //load_str = cocos2d::FileUtils::getInstance()->getStringFromFile("..\\myhero.json"); readdoc.Parse<0>(load_str.c_str()); if(readdoc.HasParseError()) { CCLOG("GetParseError%s\n", readdoc.GetParseError()); } if(!readdoc.IsObject()) return 0; rapidjson::Value& _json = readdoc["json"]; const char* ch = _json.GetString(); cocos2d::log(ch); cocos2d::log(_json.GetString()); rapidjson::Value& _array = readdoc["array"]; if(_array.IsArray()) { CCLOG("test"); for(int i=0; i<_array.Capacity(); i++) { //CCLOG("%d", i); rapidjson::Value& arraydoc = _array[i]; if(arraydoc.HasMember("inttag")) { int _inttag = arraydoc["inttag"].GetInt(); CCLOG("%d", _inttag); } if(arraydoc.HasMember("doubletag")) { double _doubletag = arraydoc["doubletag"].GetDouble(); CCLOG("%lf", _doubletag); } if(arraydoc.HasMember("booltag")) { bool _booltag = arraydoc["booltag"].GetBool(); CCLOG("%d", _booltag); } if(arraydoc.HasMember("hellotag")) { const char* _hellotag = arraydoc["hellotag"].GetString(); CCLOG("%s", _hellotag); } } } return 0; }CCLOG 的最终显示为:
json string
json string
test
1
1.000000
1
helloworld
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。