nlohmann json可以很方便的实现struct与json的互转。
对于化定义结构体成员时有就地初始的情况:、
#include <iostream>
#include <string>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace std;
struct PersonDefault{
string name = "";
int sex = 1;
};
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(PersonDefault, name, sex)
void struct_default_json()
{
PersonDefault p1 = {"xiaoming", 1};
json j1 = p1;
cout<<"j1:"<<j1<<endl;
PersonDefault p2 = j1.get<PersonDefault>();
cout<<"p2:"<<p2.name<<" sex:"<<p2.sex<<endl;
}
int main()
{
struct_default_json();
return 0;
}运行程序输出:
j1:{"name":"xiaoming","sex":1}
p2:xiaoming sex:1
可以看到可以通过NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT很方便的进行互转
对于定义结构体时没有就地初始化的情况:
#include <iostream>
#include <string>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
using namespace std;
struct PersonDefault{
string name;
int sex;
};
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(PersonDefault, name, sex)
void struct_nodefault_json()
{
PersonDefault p1 = {"xiaoming", 1};
json j1 = p1;
cout<<"j1:"<<j1<<endl;
PersonDefault p2 = j1.get<PersonDefault>();
cout<<"p2:"<<p2.name<<" sex:"<<p2.sex<<endl;
try
{
PersonDefault p3 = {"xiaoming"};
json j3 = p3;
cout<<"j3:"<<j3<<endl;
}
catch(json::exception& e)
{
cout<<"struct to json failed: "<<e.what()<<endl;
}
try
{
json j4 = R"({"name":"xiaoming"})"_json;
PersonDefault p4 = j4.get<PersonDefault>();
cout<<"p4:"<<p4.name<<" sex:"<<p4.sex<<endl;
}
catch(json::exception& e)
{
cout<<"json to struct failed: "<<e.what()<<endl;
}
}
int main()
{
struct_nodefault_json();
return 0;
}运行程序输出:
j1:{"name":"xiaoming","sex":1}
p2:xiaoming sex:1
j3:{"name":"xiaoming","sex":0}
json to struct failed: [json.exception.out_of_range.403] key 'sex' not found
可以看出当struct与json的内容互相匹配时,stuct <-> json的转换没问题
PersonDefault p3 = {"xiaoming"};
虽然只设定了name,但是默认构造会设定sex。
所以struct -> json 也没有问题
但是当json的内容缺少struct的某一个key时,就会出现异常
实测后发现当json的内容多于struct的key时,比如:
json j4 = R"({"name":"xiaoming","sex":0, "age":8})"_json;
PersonDefault p4 = j4.get<PersonDefault>();
也是没有问题的
需要注意的是:
对于类和struct,只要成员变量是public的,都可以使用这两个宏进行转换。
版权声明:本文为jiemashizhen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。