c++ 中 struct 如何方便快捷地转成 json
在开发过程中常需要把结构体和 json 相互转换,如果 json 字段较多,简直就是灾难,要写很多重复的、类似的代码,下面推荐一种 struct 转 json 的简便方法。采用 nlohmann_json 实现(不作介绍,自行去 github 查看详情)。
示例
创建一个 test.h 文件,写入下面的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef __TEST__H__
#define __TEST__H__
#include "nlohmann/json.hpp"
#include <string>
struct Person {
std::string name;
int age;
};
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Person, age, name)
#endif // __TEST__H__
创建一个 test.cpp文件, 写入下面的代码
1
2
3
4
5
6
7
8
9
10
11
#include "test.h"
#include <iostream>
using Json = nlohmann::json;
void test() {
Person me {"yuqing", 27};
Json json;
to_json(json, me);
std::cout << json.dump(4) << "\n";
}
总结
在上面的代码中,有如下几个需要简要介绍一下:
- 1、在 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Person, age, name) 中, Person 是结构体名, age 和 name 是结构体成员,可以交换结构体成员的位置, 例如:NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Person, name, age) 也是可以的,等效于前者。
- 2、可以连续声明多个结构体,并对该结构体使用 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 宏;
- 3、NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 宏的本质是编译时自动展开生成两个函数, 例如对于 Person,相当于生成了下面两个函数:
1
2
3
void to_json(Json& j, const Person& p);
void from_json(const Json& j, Person& p);
- 4、json.dump(4) 会把 json 转化成 string, 并且以 tap = 4 的方式格式化,例如上面最终的输出结果为:
1
2
3
4
{
"name":"yuqing",
"age": 27
}
如果是 json.dump() 则输出如下字符串:
1
2
{"name":"yuqing","age":27}
本文由作者按照 CC BY 4.0 进行授权