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<ENUM_TYPE, BasicJsonType>& 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"

相关推荐
WL学习笔记10 小时前
C & C++ 内存管理
c++·c++内存管理
宛 禾12 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
hetao173383712 小时前
联盟场-提高组-R7 & ZYZSC-S-Round 11
c++·算法
程序喵大人12 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
局部有解13 小时前
Hot100 - 三数之和
数据结构·c++·算法
longlongzihan13 小时前
C++ 常用数据结构速查:vector、stack、queue、list、树、图、哈希表等声明与核心操作
数据结构·c++·list
别动我齐刘海13 小时前
实时控制学习2
linux·c++·人工智能·学习·算法
Dxy123931021614 小时前
MySQL JSON 生成列索引原理、实战与坑点
mysql·adb·json
hetao173383714 小时前
校内场-提高组 ZYZSC-S-Round 2
c++·算法
hetao173383715 小时前
2026-10-14 hetao1733837 的刷题记录
c++·算法