rapidjson读写方法总结
来源:互联网 发布:君将哀而生之乎的翻译 编辑:程序博客网 时间:2024/05/19 17:11
这个写的有些复杂,包含太多方法了。其实我真正在项目里用的是自己简化的版本,不过都是基于这个版本修改的。
.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 Modeinline 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_, _Method_).c_str(), "File does not exist");}#elseinline 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, then create this, Method = %s ", _File_, _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 prettyFlag = true, 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, string filename, bool save = false);bool getBooleanForKey(string key, string filename); void setDoubleForKey(string key, float value, string filename, bool save = false);float getDoubleForKey(string key, string filename); void setStringForKey(string key, string value, string filename, 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, string key, rapidjson::Value& value, 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, const std::string &fileName, 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 ENCRYPTIONstd::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 ENCRYPTIONstring tagStr = tag;for (int i = 0; i < tag.size(); i++)tagStr[i] ^= tag[tag.size() - 1 - i];fwrite(tagStr.c_str(), 1, tagStr.size(), fp);#endiffclose(fp);};if (Asynchronous){std::thread save(saveHandler, std::string(buffer.GetString(), buffer.GetSize()), fileName);save.detach();}else{saveHandler(std::string(buffer.GetString(), buffer.GetSize()), 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, int value, string filename, 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, 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);}}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 value, string filename, 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, 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);}}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, float value, string filename, 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, filename); string name = filename + ".json"; string jsonBuffer = FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->getWritablePath().append(name)); assert(jsonBuffer != ""); parseJson(filename, 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, string value, string filename, 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()), allocator); if (save) saveJson(doc, filename);}else{doc->AddMember(StringRef(key.c_str()), StringRef(value.c_str()), allocator); saveJson(doc, filename); string name = filename + ".json"; string jsonBuffer = FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->getWritablePath().append(name)); assert(jsonBuffer != ""); parseJson(filename, 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, num, _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, _USER_); CCLOG("%s", temo0.c_str()); JsonUtils::getInstance()->setBooleanForKey(key2, true, _USER_); JsonUtils::getInstance()->setBooleanForKey(key2, true, _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_
1 0
- rapidjson读写方法总结
- rapidjson读写测试
- rapidjson使用总结
- rapidjson 使用总结
- rapidjson使用总结
- C++ rapidjson Unicode编码总结
- rapidjson
- Java读写文件方法总结
- Java读写文件方法总结
- 总结C++读写文件的方法
- MFC中的文件读写方法总结
- python读写csv文件方法总结
- 【RapidJson】Rapidjson解析
- 内核读写只读内存方法总结[Delphi描述]
- jxl读写excel常见操作 方法总结二
- Linux用户态程序读写IO端口方法总结
- Linux用户态程序读写IO端口方法总结
- directx10 11中读写gpu的resource方法补充总结
- 毕业这三年
- kvm qemu 文件夹穿透
- 位图和模型颜色混合(opengl)
- 关于矩阵的迹的几个性质证明
- AsyncTask实现原理
- rapidjson读写方法总结
- 如何下载谷歌地球高程为TIF格式的文件
- 微信开发笔记
- 原子性获取最大值
- Java异常之catch语句块
- 2015.11.16,Demo10,6.2处理对象,面向接口编程
- resources.arsc格式(包->类型->资源项)
- 08(maven+SSH)之使用nexus搭建maven私有服务器
- listView的简单用法