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

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

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

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

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

[cpp]  view plain  copy
  1. #pragma once  
  2. #include "RapidjsonHelper.h"  
  3. using namespace PBLIB::RapidJsonHelper;  
  4.   
  5. class MyClass3 :public JsonBase  
  6. {  
  7. public:  
  8.     int age;  
  9.     char name[100];  
  10.     std::string text;  
  11.     double money;  
  12.   
  13.     MyClass3(){  
  14.         memset(name, 0, ARRAY_SIZE(name));  
  15.     }  
  16.     ~MyClass3(){}  
  17.   
  18.     void ToWrite(Writer<StringBuffer> &writer)  
  19.     {  
  20.         RapidjsonWriteBegin(writer);  
  21.         RapidjsonWriteString(text);  
  22.         RapidjsonWriteChar(name);  
  23.         RapidjsonWriteInt(age);  
  24.         RapidjsonWriteDouble(money);  
  25.         RapidjsonWriteEnd();  
  26.     }  
  27.   
  28.     void ParseJson(const Value &val)  
  29.     {  
  30.         RapidjsonParseBegin(val);  
  31.         RapidjsonParseToString(text);  
  32.         RapidjsonParseToInt(age);  
  33.         RapidjsonParseToDouble(money);  
  34.         RapidjsonParseToChar(name);  
  35.         RapidjsonParseEnd();  
  36.     }  
  37.   
  38. };  
[cpp]  view plain  copy
  1. #include "RapidjsonHelper.h"  
  2. #include "MyClass3.h"  
  3.   
  4. using namespace PBLIB::RapidJsonHelper;  
  5.   
  6. class MyClass :public JsonBase  
  7. {  
  8. public:  
  9.     MyClass(){  
  10.         memset(name, 0, ARRAY_SIZE(name));  
  11.     }  
  12.     ~MyClass(){}  
  13.   
  14.     int age;  
  15.     char name[100];  
  16.     std::string text;  
  17.     double money;  
  18.     JsonArray<int> lst;  
  19.     JsonArray<MyClass3> lst2;  
  20.   
  21.     void ToWrite(Writer<StringBuffer> &writer)  
  22.     {  
  23.         RapidjsonWriteBegin(writer);  
  24.         RapidjsonWriteString(text);  
  25.         RapidjsonWriteChar(name);  
  26.         RapidjsonWriteInt(age);  
  27.         RapidjsonWriteDouble(money);  
  28.         RapidjsonWriteClass(lst);  
  29.         RapidjsonWriteClass(lst2);  
  30.         RapidjsonWriteEnd();  
  31.     }  
  32.   
  33.     void ParseJson(const Value& val)  
  34.     {  
  35.         RapidjsonParseBegin(val);  
  36.         RapidjsonParseToString(text);  
  37.         RapidjsonParseToInt(age);  
  38.         RapidjsonParseToDouble(money);  
  39.         RapidjsonParseToChar(name);  
  40.         RapidjsonParseToClass(lst);  
  41.         RapidjsonParseToClass(lst2);  
  42.         RapidjsonParseEnd();  
  43.     }  
  44.   
  45.   
  46. };  
然后直接看主函数的例子
[cpp]  view plain  copy
  1. // PB_RapidJsonHelper.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "MyClass.h"  
  6.   
  7.   
  8. int main(int argc, _TCHAR* argv[])  
  9. {  
  10.   
  11.     MyClass mylclass2;  
  12.     mylclass2.age = 10;  
  13.     strcpy(mylclass2.name, "pengbo");  
  14.     mylclass2.text = "123456";  
  15.     mylclass2.money = 1.123;  
  16.     for (unsigned i = 0; i < 4; i++)  
  17.     {  
  18.         MyClass3 tmp;  
  19.         tmp.age = 10;  
  20.         strcpy(tmp.name, "pengbo");  
  21.         tmp.text = "12345我6";  
  22.         tmp.money = 1.123;  
  23.         mylclass2.lst2.arr.push_back(tmp);  
  24.     }  
  25.     for (unsigned i = 0; i < 4; i++)  
  26.     {  
  27.         mylclass2.lst.arr.push_back(i);  
  28.     }  
  29.     //构造完成  
  30.   
  31.     //std::string str2= mylclass2.lst2.ToJson();  
  32.   
  33.     //Json序列化  
  34.     std::string str = mylclass2.ToJson();//序列化完成  
  35.   
  36.     MyClass mylclassnew;  
  37.     MyClass::FromJson(&mylclassnew, str);//反序列化完成  
  38.   
  39.   
  40.     return 0;  
  41. }  
主函数整个过程,看不到RapidJson的影子,这样以后即使换一个Json库,可以保持逻辑代码不用改,这样一个RapidJson库的二次封装就完成了,完美实现了对一个C++类的序列化和反序列化实现。

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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值