很多人都知道rapidjson這個json庫,大家也都知道他的高效,可是你一定也對他的使用方法,函數API接口感受到非常不適應,你一定非常懷念使用java和C#對一個實體類的那麼輕鬆加簡單的直接json序列化,是的本篇博客將免費開源一個我自己平時做項目研發使用的一個RapidJsonHelper類,將幫你實現對一個C++實體類的的序列化和反序列化。
先貼上可完美可運行測試源碼(含rapidjson庫include)的下載地址:(評論者留郵箱不要積分額這是熟人通道)
先看一下如何使用我這個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;
- }
整個實現過程,主要利用C++ 模板和重載,宏和以及虛方法,實現完這個封裝想了我足足一天,其實想讓C++像別的高級語言一樣輕鬆實現業務邏輯,需要做的事情,就是自己把低級的東西封裝封裝再封裝。
關於這個封裝,還有性能可以提升,JsonArray對象裏面的實現現在是用list,但是其實應該自己實現一個更高效list。