nlohmann json:struct与json的互转

nlohmann json可以很方便的实现struct与json的互转。

  1. 对于化定义结构体成员时有就地初始的情况:、

#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很方便的进行互转
  1. 对于定义结构体时没有就地初始化的情况:

#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版权协议,转载请附上原文出处链接和本声明。