nlohmann/json——NLOHMANN_JSON_SERIALIZE_ENUM

目录

源码如下:

源码分析:

使用示例:


源码如下:

cpp 复制代码
/*!
@brief macro to briefly define a mapping between an enum and JSON
@def NLOHMANN_JSON_SERIALIZE_ENUM
@since version 3.4.0
*/
#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...)                                    \
    template<typename BasicJsonType>                                                    \
    inline void to_json(BasicJsonType& j, const ENUM_TYPE& e)                           \
    {                                                                                   \
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");  \
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;             \
        auto it = std::find_if(std::begin(m), std::end(m),                              \
            [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool             \
        {                                                                               \
            return ej_pair.first == e;                                                  \
        });                                                                             \
        j = ((it != std::end(m)) ? it : std::begin(m))->second;                         \
    }                                                                                   \
    template<typename BasicJsonType>                                                    \
    inline void from_json(const BasicJsonType& j, ENUM_TYPE& e)                         \
    {                                                                                   \
        static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");  \
        static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__;             \
        auto it = std::find_if(std::begin(m), std::end(m),                              \
            [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool            \
        {                                                                               \
            return ej_pair.second == j;                                                 \
        });                                                                             \
        e = ((it != std::end(m)) ? it : std::begin(m))->first;                          \
    }

源码分析:

从注释看,NLOHMANN_JSON_SERIALIZE_ENUM宏是将用户定义的枚举类型与JSON进行映射。其实际上是定义了两个模板函数,to_json和from_json,宏的第一个参数ENUM_TYPE是用户定义的枚举类型,后面携带了可变参数,即...符号。

// asset检查,看ENUM_TYPE是否是枚举,其中#符号为宏中的特殊运算符,在预编译时期,用于将宏参数转换为字符串

static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!");

// __VA_ARGS__为系统自定义变量,指向宏中的可变参数

static const std::pair<ENUM_TYPE, BasicJsonType> m[] = VA_ARGS;

// 在可变参数指定的map中查找

auto it = std::find_if(std::begin(m), std::end(m),

e\](const std::pair\\& ej_pair) -\> bool { return ej_pair.first == e; }); j = ((it != std::end(m)) ? it : std::begin(m))-\>second; ## 使用示例: ```cpp enum class Type { kType1 = 0, kType2 = 1, kType3 = 2, kType4 = 3, kType5 = 4 }; NLOHMANN_JSON_SERIALIZE_ENUM(Type, { {Type::kType1, nullptr}, {Type::kType2, "stopped"}, {Type::kType3, "running"}, {Type::kType4, "completed"}, {Type::kType5, "completed"}, }); int main(int argc, char *argv[]) { Type t = Type::kType4; nlohmann::json j = t; std::cout << "dump:" << j.dump() << std::endl; return 0; } ``` 运行结果如下: dump:"completed"

相关推荐
躲着人群24 分钟前
次短路&&P2865 [USACO06NOV] Roadblocks G题解
c语言·数据结构·c++·算法·dijkstra·次短路
一只鲲1 小时前
56 C++ 现代C++编程艺术5-万能引用
开发语言·c++
小欣加油2 小时前
leetcode 1493 删掉一个元素以后全为1的最长子数组
c++·算法·leetcode
争不过朝夕,又念着往昔3 小时前
即时通讯项目---网关服务
linux·c++·vscode
蓝风破云3 小时前
C++实现常见的排序算法
数据结构·c++·算法·排序算法·visual studio
怀旧,3 小时前
【C++】 9. vector
java·c++·算法
Chandler_Song6 小时前
Excel 转化成JSON
python·json
这儿有一堆花6 小时前
C++标准库算法:从零基础到精通
c++
GISBox6 小时前
GISBox支持WMS协议的技术突破
vue.js·json·gis
weixin_307779139 小时前
C++进程监视器与自动启动程序
开发语言·c++·算法