最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換

 更新時間:2021年09月30日 09:07:39   作者:Yaronzz  
這篇文章主要介紹的是C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換,json字符串一般使用的是開源的類庫Newtonsoft.Json,方法十分簡潔,下面就隨小編一起看下面文章內(nèi)容吧

1. 背景與需求

之前寫C#的時候,解析json字符串一般使用的是開源的類庫Newtonsoft.Json,方法十分簡潔,比如:

class Project
{
    public string Input { get; set; }
    public string Output { get; set; }
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
Project test = serializer.Deserialize<Project>(@"{"Input":"1","Output":"2"}");


一行代碼就能將json字符串轉(zhuǎn)為相應(yīng)的類對象。

最近寫C++需要處理一下json數(shù)據(jù),于是上github找了很多很強大的開源庫,像jsoncpp、rapidjsonjson,基本上都滿足了開發(fā)需求,但想要做成像寫C#那樣子就要做二次開發(fā)。于是有了自己寫一個簡單的json轉(zhuǎn)類 | 結(jié)構(gòu)體的工具的想法(開源地址)。

需求如下:

  • 只有頭文件,方便使用
  • 最多三行代碼解決轉(zhuǎn)換
  • 支持類|結(jié)構(gòu)體 與 json的相互轉(zhuǎn)換
  • 支持多種基本數(shù)據(jù)類型,如int、float、stringbool
  • 支持STL基本類型,如vectorlist、map<string,T>等
  • 支持嵌套關(guān)系
  • 支持成員重命名,比方說json中的關(guān)鍵字是name,成員命名可寫成Name或其他。

2. 最終使用的樣例代碼

class Student
{
public:
    string Name;
    int Age;

    AIGC_JSON_HELPER(Name, Age)//成員注冊
    AIGC_JSON_HELPER_RENAME("name","age")//成員重命名,不需要可以刪除這條
};

int main()
{
    //json轉(zhuǎn)類對象
    Student person;
    JsonHelper::JsonToObject(person, R"({"name":"XiaoMing", "age":15})");
 //類對象轉(zhuǎn)json
    string jsonStr;
    JsonHelper::ObjectToJson(person, jsonStr);
    return 0;
}

3. 實現(xiàn)方法

因為剛好rapidjson只需要頭文件就可以使用,所以選擇了rapidjson作為基礎(chǔ)庫,進(jìn)行二次開發(fā)。

3.1 基礎(chǔ)類型的轉(zhuǎn)換

作為最底層的接口,只需要進(jìn)行一個賦值的操作即可,后續(xù)如果想要增加一些其他類型支持,添加起來也比較方便。

static bool JsonToObject(int &obj, rapidjson::Value &jsonValue)
{
    if (jsonValue.IsNull() || !jsonValue.IsInt())
        return false;
    obj = jsonValue.GetInt();
    return true;
}

static bool JsonToObject(unsigned int &obj, rapidjson::Value &jsonValue)
{
    if (jsonValue.IsNull() || !jsonValue.IsUint())
        return false;
    obj = jsonValue.GetUint();
    return true;
}

static bool JsonToObject(int64_t &obj, rapidjson::Value &jsonValue)
{
    if (jsonValue.IsNull() || !jsonValue.IsInt64())
        return false;
    obj = jsonValue.GetInt64();
    return true;
}

//其他類型... ...

3.2 類成員注冊

這里使用宏定義方式 + 可變參數(shù)模板的方式來實現(xiàn),即可依次對注冊的成員進(jìn)行賦值

template <typename TYPE, typename... TYPES>
static bool WriteMembers(std::vector<std::string> &names, int index, rapidjson::Value &jsonValue, TYPE &arg, TYPES &... args)
{
    if (!WriteMembers(names, index, jsonValue, arg))
        return false;
    return WriteMembers(names, ++index, jsonValue, args...);
}

template <typename TYPE>
static bool WriteMembers(std::vector<std::string> &names, int index, rapidjson::Value &jsonValue, TYPE &arg)
{
    const char *key = names[index].c_str();
    if (!jsonValue.HasMember(key))
        return true;

    if (!JsonToObject(arg, jsonValue[key]))
        return false;
    return true;
}
#define AIGC_JSON_HELPER(...)  \
bool AIGC_CONVER_JSON_TO_OBJECT(rapidjson::Value &jsonValue, std::vector<std::string> &names) \
{     \
    if (names.size() <= 0)  \
        names = aigc::JsonHelper::GetMembersNames(#__VA_ARGS__); \
    return aigc::JsonHelper::WriteMembers(names, 0, jsonValue, __VA_ARGS__); \
} 
                                                                                                                                       

3.3 自定義類的轉(zhuǎn)換

自定義類由于并不清楚外界使用時,是否有按規(guī)定添加好成員注冊接口,所以這里采用enable_if的方式來嘗試調(diào)用,編譯的時候也就不會報錯。

template <bool, class TYPE = void>
struct enable_if
{
};

template <class TYPE>
struct enable_if<true, TYPE>
{
    typedef TYPE type;
};

template <typename T>
struct HasConverFunction
{
    template <typename TT> static char func(decltype(&TT::AIGC_CONVER_JSON_TO_OBJECT));
    template <typename TT> static int func(...);
    const static bool has = (sizeof(func<T>(NULL)) == sizeof(char));
};

template <typename T, typename enable_if<HasConverFunction<T>::has, int>::type = 0>
static inline bool JsonToObject(T &obj, rapidjson::Value &jsonValue)
{
    std::vector<std::string> names = LoadRenameArray(obj);
    return obj.AIGC_CONVER_JSON_TO_OBJECT(jsonValue, names);
}

template <typename T, typename enable_if<!HasConverFunction<T>::has, int>::type = 0>
static inline bool JsonToObject(T &obj, rapidjson::Value &jsonValue)
{
    return false;
}

3.4 外部調(diào)用接口

/**
 * @brief conver json string to class | struct
 * @param obj : class or struct
 * @param jsonStr : json string 
 */
template <typename T>
static inline bool JsonToObject(T &obj, const std::string &jsonStr)
{
    rapidjson::Document root;
    root.Parse(jsonStr.c_str());
    if (root.IsNull())
        return false;

    return JsonToObject(obj, root);
}

最核心的部分也就上面的幾個模塊,其他的都是一些瑣碎的增加類型支持等操作。

到此這篇關(guān)于C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++代碼各種注釋示例詳解

    c++代碼各種注釋示例詳解

    大家好,本篇文章主要講的是c++代碼各種注釋示例詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例

    C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例

    這篇文章主要介紹了C語言編寫基于TCP和UDP協(xié)議的Socket通信程序示例,其中TCP的客戶端與服務(wù)器端采用多線程實現(xiàn),需要的朋友可以參考下
    2016-03-03
  • c++編寫簡單的計算器程序

    c++編寫簡單的計算器程序

    用c++語言實現(xiàn)一個簡單的計算器,新手作品,僅僅包括基本的加減乘除運算。希望能夠給菜鳥們一些啟發(fā)
    2016-05-05
  • 如何利用C++實現(xiàn)mysql數(shù)據(jù)庫的連接池詳解

    如何利用C++實現(xiàn)mysql數(shù)據(jù)庫的連接池詳解

    為了提高M(jìn)ySQL數(shù)據(jù)庫的訪問的瓶頸,除了在服務(wù)器端增設(shè)緩存服務(wù)器緩存常用的數(shù)據(jù)之外(如redis),還可以增加數(shù)據(jù)庫連接池,來提高M(jìn)ySQL Server的訪問效率,這篇文章主要給大家介紹了關(guān)于如何利用C++實現(xiàn)mysql數(shù)據(jù)庫的連接池的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C語言之二叉樹的遍歷

    C語言之二叉樹的遍歷

    這篇文章主要介紹了C語言中二叉樹的遍歷:前序、中序、后序,認(rèn)識二叉樹結(jié)構(gòu)最簡單的方式就是遍歷二叉樹,感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • C++內(nèi)存管理詳細(xì)解析

    C++內(nèi)存管理詳細(xì)解析

    這篇文章主要給大家分享的是C++內(nèi)存管理的詳細(xì)內(nèi)容學(xué)習(xí),下面文章圍繞C++內(nèi)存管理的相關(guān)資料展開具體學(xué)習(xí)內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • C語言實現(xiàn)簡單的聊天室功能

    C語言實現(xiàn)簡單的聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單的聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • EasyX實現(xiàn)自由落體小球

    EasyX實現(xiàn)自由落體小球

    這篇文章主要為大家詳細(xì)介紹了EasyX實現(xiàn)自由落體小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C語言sscanf()函數(shù)、vsscanf()函數(shù)、vscanf()函數(shù)

    詳解C語言sscanf()函數(shù)、vsscanf()函數(shù)、vscanf()函數(shù)

    這篇文章主要介紹了詳解C語言sscanf()函數(shù)、vsscanf()函數(shù)、vscanf()函數(shù),是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08
  • 基于MFC實現(xiàn)貪吃蛇小游戲

    基于MFC實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了基于MFC實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

莫力| 扶风县| 孟村| 宣化县| 石景山区| 安宁市| 灵寿县| 上杭县| 随州市| 东乡| 竹溪县| 满城县| 婺源县| 永定县| 烟台市| 蚌埠市| 武城县| 盐池县| 宜川县| 汉阴县| 白玉县| 渝北区| 东乌| 哈巴河县| 宜阳县| 始兴县| 分宜县| 吉安县| 精河县| 扎赉特旗| 康保县| 水城县| 商城县| 眉山市| 芦溪县| 台东市| 和田市| 天等县| 铜梁县| 青冈县| 阜城县|