C++ 封装RapidJson把一个类Json序列化和反序列化

很多人都知道rapidjson这个json库,大家也都知道他的高效,可是你一定也对他的使用方法,函数API接口感受到非常不适应,你一定非常怀念使用java和C#对一个实体类的那么轻松加简单的直接json序列化,是的本篇博客将免费开源一个我自己平时做项目研发使用的一个RapidJsonHelper类,将帮你实现对一个C++实体类的的序列化和反序列化。

先贴上可完美可运行测试源码(含rapidjson库include)的下载地址:http://download.csdn.net/detail/lightspear/9746091 (评论者留邮箱不要积分额大笑这是熟人通道)

先看一下如何使用我这个RapidjsonHelper帮助类

先创建两个实体类MyClass3和MyClass分别引用上RapidjsonHelper.h文件,继承好JsonBase这个父类,实现两个虚函数。

#pragma once
#include "RapidjsonHelper.h"
using namespace PBLIB::RapidJsonHelper;

class MyClass3 :public JsonBase
{
public:
	int age;
	char name[100];
	std::string text;
	double money;

	MyClass3(){
		memset(name, 0, ARRAY_SIZE(name));
	}
	~MyClass3(){}

	void ToWrite(Writer<StringBuffer> &writer)
	{
		RapidjsonWriteBegin(writer);
		RapidjsonWriteString(text);
		RapidjsonWriteChar(name);
		RapidjsonWriteInt(age);
		RapidjsonWriteDouble(money);
		RapidjsonWriteEnd();
	}

	void ParseJson(const Value &val)
	{
		RapidjsonParseBegin(val);
		RapidjsonParseToString(text);
		RapidjsonParseToInt(age);
		RapidjsonParseToDouble(money);
		RapidjsonParseToChar(name);
		RapidjsonParseEnd();
	}

};
#include "RapidjsonHelper.h"
#include "MyClass3.h"

using namespace PBLIB::RapidJsonHelper;

class MyClass :public JsonBase
{
public:
	MyClass(){
		memset(name, 0, ARRAY_SIZE(name));
	}
	~MyClass(){}

	int age;
	char name[100];
	std::string text;
	double money;
	JsonArray<int> lst;
	JsonArray<MyClass3> lst2;

	void ToWrite(Writer<StringBuffer> &writer)
	{
		RapidjsonWriteBegin(writer);
		RapidjsonWriteString(text);
		RapidjsonWriteChar(name);
		RapidjsonWriteInt(age);
		RapidjsonWriteDouble(money);
		RapidjsonWriteClass(lst);
		RapidjsonWriteClass(lst2);
		RapidjsonWriteEnd();
	}

	void ParseJson(const Value& val)
	{
		RapidjsonParseBegin(val);
		RapidjsonParseToString(text);
		RapidjsonParseToInt(age);
		RapidjsonParseToDouble(money);
		RapidjsonParseToChar(name);
		RapidjsonParseToClass(lst);
		RapidjsonParseToClass(lst2);
		RapidjsonParseEnd();
	}


};
然后直接看主函数的例子
// PB_RapidJsonHelper.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "MyClass.h"


int main(int argc, _TCHAR* argv[])
{

	MyClass mylclass2;
	mylclass2.age = 10;
	strcpy(mylclass2.name, "pengbo");
	mylclass2.text = "123456";
	mylclass2.money = 1.123;
	for (unsigned i = 0; i < 4; i++)
	{
		MyClass3 tmp;
		tmp.age = 10;
		strcpy(tmp.name, "pengbo");
		tmp.text = "12345我6";
		tmp.money = 1.123;
		mylclass2.lst2.arr.push_back(tmp);
	}
	for (unsigned i = 0; i < 4; i++)
	{
		mylclass2.lst.arr.push_back(i);
	}
	//构造完成

	//std::string str2= mylclass2.lst2.ToJson();

	//Json序列化
	std::string str = mylclass2.ToJson();//序列化完成

	MyClass mylclassnew;
	MyClass::FromJson(&mylclassnew, str);//反序列化完成


	return 0;
}
主函数整个过程,看不到RapidJson的影子,这样以后即使换一个Json库,可以保持逻辑代码不用改,这样一个RapidJson库的二次封装就完成了,完美实现了对一个C++类的序列化和反序列化实现。

整个实现过程,主要利用C++ 模板和重载,宏和以及虚方法,实现完这个封装想了我足足一天,其实想让C++像别的高级语言一样轻松实现业务逻辑,需要做的事情,就是自己把低级的东西封装封装再封装吐舌头

关于这个封装,还有性能可以提升,JsonArray对象里面的实现现在是用list,但是其实应该自己实现一个更高效list。






  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 43
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值