很多人都知道rapidjson这个json库,大家也都知道他的高效,可是你一定也对他的使用方法,函数API接口感受到非常不适应,你一定非常怀念使用java和C#对一个实体类的那么轻松加简单的直接json序列化,是的本篇博客将免费开源一个我自己平时做项目研发使用的一个RapidJsonHelper类,将帮你实现对一个C++实体类的的序列化和反序列化。
先贴上可完美可运行测试源码(含rapidjson库include)的下载地址:http://download.youkuaiyun.com/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。