大佬教程收集整理的这篇文章主要介绍了rapidjson读写方法总结,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这个写的有些复杂,包含太多方法了。其实我真正在项目里用的是自己简化的版本,不过都是基于这个版本修改的。
.h 文件
//******************************* // Json Parse // Created by Simon on 10/29/2015 //******************************* #ifndef _JSON_UTILS_H_ #define _JSON_UTILS_H_ #include <iostream> #include <String> #include "json/rapidjson.h" #include "json/document.h" #include "json/writer.h" #include "json/Stringbuffer.h" #include "json/prettywriter.h" #include "cocos2d.h" using namespace std; using namespace rapidjson; USING_NS_Cc; // Basic check; #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_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_is_object(value,strKey) (value.HasMember(strKey) && value[strKey].IsObject()) // Utils Method; #if (0) // 1 Myself Debug Mode inline void String_check_Null(String _String_,String _Method_) { if (_String_ == "") messageBox(StringUtils::format("Has null String In %s",_Method_).c_str(),"HasParseError"); } inline void File_Not_Exist(const char* _File_,const char* _Method_) {messageBox(StringUtils::format("CODE-ERROR %s Does Not Exist,then create this,Method = %s",_File_,"File does not exist");} #else inline void String_check_Null(String _String_,const char* _Method_) { if (_String_ == "") CCLOG(StringUtils::format("Has null String In %s,HasParseError",_Method_).c_str()); } inline void File_Not_Exist(const char* _File_,const char* _Method_) { CCLOG(StringUtils::format("CODE-ERROR %s Does Not Exist,Method = %s ",_Method_).c_str()); } inline void DefaultFile(String _File_) { CCLOG("Platform Default Path = %s",_File_.c_str()); } #endif // File Path; const String _user_ = "user.json"; const String _test_ = "test.json"; const String REF_PATH = "data/"; const int ENCRYPTION = 0; class JsonUtils : public Ref { private: JsonUtils(); ~JsonUtils(); static JsonUtils* _self; map<std::string,rapidjson::Document*> _docBuffer; public: static JsonUtils* geTinstance(); void deleteInstance(); //-----------UserData-Method-Begin-----------; // Type 1 : writable path,Type : 0 resource path; void loadJson(String filename,bool isWritable = truE); void parseJson(String filename,String jsonBuffer); void writeJson(String fileName); void SETVALue(String filename,String key,rapidjson::Value& value,bool save = falsE); void saveJson(rapidjson::Document* doc,const std::string &filename,bool prettyFlag = true,bool Asynchronous = falsE); void saveJson(const std::string& filename,bool Asynchronous = falsE); void unloadJson(String fileName); void setIntegerForKey(String key,int value,String filename,bool save = falsE); int getIntegerForKey(String key,String fileName); void setBooleanForKey(String key,bool value,bool save = falsE); bool getBooleanForKey(String key,String fileName); void setDoubleForKey(String key,float value,bool save = falsE); float getDoubleForKey(String key,String fileName); void setStringForKey(String key,String value,bool save = falsE); String getStringForKey(String key,String fileName); rapidjson::Document* getDoc(String fileName); rapidjson::Value& getValue(String filename,String key); void TESTCode(); //--------------UserData-Method-End------------- }; #endif //_JSON_UTILS_H_ //_EOF_/.--- ... --- -. ..- - .. .-.. ... .-.-.- ..../
.cpp文件
//******************************* // Json Parse // Created on 10/29/2015 //******************************* #include "JsonUtils.h" JsonUtils* JsonUtils::_self = nullptr; JsonUtils::JSonUtils() { _docBuffer.clear(); } JsonUtils::~JsonUtils() { } JsonUtils* JsonUtils::geTinstance() { if (!_self) { _self = new JsonUtils(); } return _self; } void JsonUtils::deleteInstance() { if (_self) { delete(_self); } _self = nullptr; } void JsonUtils::loadJson(String filename,bool isWritablE) { String path = ""; if (isWritablE) { path = FileUtils::geTinstance()->getWritablePath().append(fileName); assert(path!=""); } else { path = REF_PATH + filename; } if (!FileUtils::geTinstance()->isFileExist(path)) { File_Not_Exist(filename.c_str(),"JsonUtils::loadJson"); writeJson(fileName); } String jsonBuffer = FileUtils::geTinstance()->getStringFromFile(path); assert(jsonBuffer != ""); parseJson(filename,jsonBuffer); } void JsonUtils::parseJson(String filename,String jsonBuffer) { rapidjson::Document* doc = new rapidjson::Document(); doc->Parse<rapidjson::kParseDefaultFlags>(jsonBuffer.c_str()); assert(doc->IsObject()); _docBuffer[filename] = doc; } void JsonUtils::writeJson(String fileName) { String value = filename + " data"; rapidjson::Document* doc = new rapidjson::Document(); rapidjson::Document::AllocatorType& allocator = doc->GetAllocator(); doc->SetObject(); doc->AddMember("description",StringRef(value.c_str()),allocator); saveJson(doc,fileName); } void JsonUtils::SETVALue(String filename,bool savE) { rapidjson::Document* doc = _docBuffer[filename]; rapidjson::Document::AllocatorType& allocator = doc->GetAllocator(); assert(doc->IsObject()); rapidjson::Value& var = *doc; if (doc->HasMember(key.c_str())) { var[key.c_str()] = value; if (savE) saveJson(doc,fileName); } else { doc->AddMember(StringRef(key.c_str()),value,allocator); saveJson(doc,fileName); String name = filename + ".json"; String jsonBuffer = FileUtils::geTinstance()->getStringFromFile(FileUtils::geTinstance()->getWritablePath().append(Name)); assert(jsonBuffer != ""); parseJson(filename,jsonBuffer); } } void JsonUtils::saveJson(rapidjson::Document* doc,bool prettyFlag,bool Asynchronous) { StringBuffer buffer; buffer.Clear(); if (prettyFlag) { rapidjson::PrettyWriter<rapidjson::stringBuffer> writer(buffer); //writer.SeTindent(' ',2); doc->Accept(writer); } else { rapidjson::Writer<rapidjson::stringBuffer> writer(buffer); doc->Accept(writer); } std::function<void(std::string,std::string)> saveHandler = [](std::string str,std::string fName) { #if ENCRYPTION std::string tag = fName; for (int i = 0; i < str.size(); i++) str[i] ^= tag[i % tag.size()]; #endif std::string filepath = FileUtils::geTinstance()->getWritablePath().append(fName); FILE *fp = fopen(filepath.c_str(),"wb"); //fputs(str.c_str(),fp); fwrite(str.c_str(),1,str.size(),fp); #if ENCRYPTION String tagStr = tag; for (int i = 0; i < tag.size(); i++) tagStr[i] ^= tag[tag.size() - 1 - i]; fwrite(tagStr.c_str(),tagStr.size(),fp); #endif fclose(fp); }; if (Asynchronous) { std::thread save(saveHandler,std::string(buffer.GetString(),buffer.GetSize()),fileName); save.detach(); } else { saveHandler(std::string(buffer.GetString(),fileName); } } void JsonUtils::saveJson(const std::string& filename,bool prettyFlag /*= true*/,bool Asynchronous /*= false*/) { saveJson(_docBuffer[filename],filename,prettyFlag,Asynchronous); } void JsonUtils::unloadJson(String fileName) { map<String,rapidjson::Document*>::iterator iter; iter = _docBuffer.find(fileName); if (iter != _docBuffer.end()) { _docBuffer.erase(iter); } } void JsonUtils::setIntegerForKey(String key,bool savE) { rapidjson::Document* doc = _docBuffer[filename]; rapidjson::Document::AllocatorType& allocator = doc->GetAllocator(); if (json_check_is_int32((*doC),key.c_str())) { (*doC)[key.c_str()].SeTint(value); if (savE) saveJson(doc,jsonBuffer); } } int JsonUtils::getIntegerForKey(String key,String fileName) { rapidjson::Document* doc = _docBuffer[filename]; assert(doc); if (json_check_is_int32((*doC),key.c_str())) { return (*doC)[key.c_str()].GeTint(); } return 0; } void JsonUtils::setBooleanForKey(String key,bool savE) { rapidjson::Document* doc = _docBuffer[filename]; rapidjson::Document::AllocatorType& allocator = doc->GetAllocator(); rapidjson::Value& var = *doc; if (json_check_is_bool(var,key.c_str())) { var[key.c_str()].SetBool(value); if (savE) saveJson(doc,jsonBuffer); } } bool JsonUtils::getBooleanForKey(String key,String fileName) { if (_docBuffer[filename] && _docBuffer[filename]->HasMember(key.c_str())) { return (*_docBuffer[filename])[key.c_str()].GetBool(); } return false; } void JsonUtils::setDoubleForKey(String key,bool savE) { rapidjson::Document* doc = _docBuffer[filename]; rapidjson::Document::AllocatorType& allocator = doc->GetAllocator(); rapidjson::Value& var = *doc; String floatStr = __String::createWithFormat("%.2f",value)->getCString(); if (json_check_is_String(var,key.c_str())) { var[key.c_str()].SetString(StringRef(floatStr.c_str()),allocator); if (savE) saveJson(doc,fileName); } else { doc->AddMember(StringRef(key.c_str()),StringRef(floatStr.c_str()),allocator); saveJson(doc,jsonBuffer); } } float JsonUtils::getDoubleForKey(String key,String fileName) { if (_docBuffer[filename] && _docBuffer[filename]->HasMember(key.c_str())) { return atof(((*_docBuffer[filename])[key.c_str()].GetString())); } return 0.0f; } void JsonUtils::setStringForKey(String key,bool savE) { rapidjson::Document* doc = _docBuffer[filename]; rapidjson::Document::AllocatorType& allocator = doc->GetAllocator(); rapidjson::Value& var = *doc; if (json_check_is_String(var,key.c_str())) { var[key.c_str()].SetString(StringRef(value.c_str()),jsonBuffer); } } std::string JsonUtils::getStringForKey(String key,String fileName) { if (_docBuffer[filename] && _docBuffer[filename]->HasMember(key.c_str())) { return (*_docBuffer[filename])[key.c_str()].GetString(); } return ""; } rapidjson::Document* JsonUtils::getDoc(String fileName) { if (_docBuffer[filename]) { return _docBuffer[filename]; } return nullptr; } rapidjson::Value& JsonUtils::getValue(String filename,String key) { if (_docBuffer[filename] && _docBuffer[filename]->HasMember(key.c_str())) { return (*_docBuffer[filename])[key.c_str()]; } } void JsonUtils::TESTCode() { JsonUtils::geTinstance()->loadJson(_user_); JsonUtils::geTinstance()->loadJson(_test_); int num = 100; String key1 = "aaa"; String key2 = "bb"; String key3 = "c"; String key4 = "d"; JsonUtils::geTinstance()->setIntegerForKey(key1,num,_user_); JsonUtils::geTinstance()->setIntegerForKey(key1,_test_); int temp = JsonUtils::geTinstance()->getIntegerForKey(key1,_user_); int temp2 = JsonUtils::geTinstance()->getIntegerForKey(key1,_test_); CCLOG("%d %d ",temp,temp2); JsonUtils::geTinstance()->setStringForKey(key4,"dddddddd",_user_); String temp9 = JsonUtils::geTinstance()->getStringForKey(key4,_user_); CCLOG("%s",temp9.c_str()); JsonUtils::geTinstance()->setStringForKey(key4,"ffffffff",_user_); String temo0 = JsonUtils::geTinstance()->getStringForKey(key4,temo0.c_str()); JsonUtils::geTinstance()->setBooleanForKey(key2,true,_user_); JsonUtils::geTinstance()->setBooleanForKey(key2,_test_); bool temp32 = JsonUtils::geTinstance()->getBooleanForKey(key2,_user_); bool temp3 = JsonUtils::geTinstance()->getBooleanForKey(key2,_test_); JsonUtils::geTinstance()->setDoubleForKey(key3,1.56f,_user_); double temP6 = JsonUtils::geTinstance()->getDoubleForKey(key3,_user_); CCLOG("%f ",temP6); JsonUtils::geTinstance()->saveJson(_user_); // Value Methods; rapidjson::Value cache; cache.SeTint(12220); JsonUtils::geTinstance()->SETVALue(_user_,"qwer",cachE); cache.SetBool(false); JsonUtils::geTinstance()->SETVALue(_user_,"bool",cachE); cache.SetDouble(1.9966f); JsonUtils::geTinstance()->SETVALue(_user_,"float",cachE); cache.SetString("gggg"); JsonUtils::geTinstance()->SETVALue(_user_,"ConstString",cachE); String Hello = "dd"; cache.SetString(StringRef(Hello.c_str())); JsonUtils::geTinstance()->SETVALue(_user_,"CopyString",cachE); rapidjson::Document* please = JsonUtils::geTinstance()->getDoc(_user_); CCLOG("%s",(*pleasE)["d"].GetString()); // Other Path Files; JsonUtils::geTinstance()->loadJson("data.json",falsE); String data = JsonUtils::geTinstance()->getStringForKey(key4,"data"); CCLOG("data from ref/data %s",data.c_str()); } //_EOF_
以上是大佬教程为你收集整理的rapidjson读写方法总结全部内容,希望文章能够帮你解决rapidjson读写方法总结所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。