Json   发布时间:2022-04-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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,请注明来意。