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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章