背景与需求
之前写C#的时候,解析json字符串一般使用的是开源的类库Newtonsoft.Json,方法十分简洁,比如:
class
一行代码就能将json字符串转为相应的类对象。
最近写C++需要处理一下json数据,于是上github找了很多很强大的开源库,像jsoncpp、rapidjson、json,基本上都满足了开发需求,但想要做成像写C#那样子就要做二次开发。于是有了自己写一个简单的json转类 | 结构体的工具的想法。
需求如下:
只有头文件,方便使用最多三行代码解决转换支持类 | 结构体 与 json的相互转换支持多种基本数据类型,如int、float、string、bool等支持STL基本类型,如vector、list、map<string,T>等支持嵌套关系支持成员重命名,比方说json中的关键字是name,成员命名可写成Name或其他。
最终使用的样例代码
class
实现方法
因为刚好rapidjson只需要头文件就可以使用,所以选择了rapidjson作为基础库,进行二次开发。
基础类型的转换
作为最底层的接口,只需要进行一个赋值的操作即可,后续如果想要增加一些其他类型支持,添加起来也比较方便。
static
类成员注册
这里使用宏定义方式 + 可变参数模板的方式来实现,即可依次对注册的成员进行赋值
template
自定义类的转换
自定义类由于并不清楚外界使用时,是否有按规定添加好成员注册接口,所以这里采用enable_if的方式来尝试调用,编译的时候也就不会报错。
template
外部调用接口
/**
最核心的部分也就上面的几个模块,其他的都是一些琐碎的增加类型支持等操作。
学习与引用
腾讯json解析库:Tencent/rapidjson杨昕: C++ 轻量级对象JSON序列化实现备注
工程已经放在Github,名字为AIGCJson,有什么建议或者想法的,欢迎提出issue或者pull request