1. 程式人生 > >json與C++結構體互轉

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,群共享裡面有程式碼