json與C++結構體互轉
程式碼在 https://github.com/xyz347/x2struct
可以將 json轉換為C++結構體,也可以將C++結構體轉為json字串。
除了json,同時還支援 xml/bson/libconfig與C++結構體之間的互轉(預設關閉,如果需要請修改config.h)
使用起來很簡單,直接看例子,重點看有註釋的行:
#include <iostream> #include "x2struct.hpp" // 包含這個標頭檔案 using namespace std; struct example { int a; string b; XTOSTRUCT(O(a,b)); // 結構體後面加上巨集XTOSTRUCT,把所有變數包含到裡面去 }; int main(int argc, char*argv[]) { example e; string jstr="{\"a\":123, \"b\":\"hello\"}"; x2struct::X::loadjson(jstr, e, false); // json轉結構體 cout<<"a:"<<e.a<<endl; cout<<"b:"<<e.b<<endl; string jstr1=x2struct::X::tojson(e); // 結構體轉json字串 cout<<jstr1<<endl; return 0; }
執行結果:
a:123
b:hello
{"a":123,"b":"hello"}
基本來說,只需要這麼幾步:
1. 包含x2struct.hpp 這個標頭檔案
2. 在結構體後面增加巨集XTOSTRUCT,把變數放裡面,用O/A/M其中一個字母,用哪個字母可以看github的wiki,一般用O
3. 即可呼叫x2struct::X::loadjson將json轉結構體,可以直接轉json字串,也可以轉檔案,取決於第三個引數
4. 可以呼叫x2struct::X::tojson將結構體轉json字串,最後兩個引數用來控制換行縮排
環境支援情況:
1、Gcc、Clang、vs2015都測試過可以支援
2、VC6.0不支援
特性:
1、支援結構體巢狀,需要相關的結構體都定義了XTOSTRUCT巨集
2、支援vector/set、map
3、json/bson可以直接在vector/set/map和字串之間互轉,比如vector<int> v; loadjson("[1,2,3]", v, false)是可以的
4、支援自定義資料型別,具體看下面說明
自定義資料型別:
自定義型別在json裡面都是用字串表徵。這裡以已經實現的XDate為例解釋自定義型別的應用場景。
在開發中我們經常要做一些時間配置,但是程式碼裡面一般用unix timestamp表徵時間,配置裡面用int來配時間又不直觀。以前的做法就是,配置裡面用"2018-01-01 08:00:00"這種視覺化的方式配置,載入配置的時候再用strptime解析成unix timestamp。
為了避免重複勞動,可以定義自定義型別XDate,裡面有個變數unix_time;在loadjson的時候XDate可以將字串的時間解析並儲存到unix_time裡面,在tojson的時候,XDate可以將unix_time轉成相應的時間格式,這樣程式碼可以寫成:
struct Config {
XDate begin;
XDate end;
//
};
/* 配置檔案
{
"begin":"2018-01-01 10:00:00",
"end":"2018-01-11 10:00:00"
}
*/
bool InTime(const Config &c) {
time_t now = time(0);
return now>=c.begin.unix_time && now<=c.end.unix_time;
}
自定義型別需要:
1、實現 std::string format() const;函式,用來在tojson的時候轉為字串
2、實現 void parse(const std::string&);函式,用來在loadjson的時候從字串解析到自己想要的資料
3、typedef XType<xxxx> yyyy; 最終yyyy就是所需要的自定義型別。
支援C++結構體轉Golang結構體
x2struct只有標頭檔案,沒有原始檔。json/xml的解析分別利用了rapidjson和rapidxml,也都是隻有標頭檔案的。所以可以直接支援。
bson/libconfig 是需要庫檔案的,裡面包含了一些預編譯的庫,編譯環境是gcc4.9.2 Ubuntu 12.04 X64,如果是在非相容環境裡面使用這兩個庫,需要自行下載對應原始碼,編譯。
如果無法從github上下載程式碼或者對使用有疑問,可以加群878041110,群共享裡面有程式碼