前言
前面介绍了关于nlohmann的关于结构体(类)与JSON的相互转换。
这次我们介绍关于JSON字符串解析的常见问题
解析函数parse()
nlohmann::json::parse(std::string& str)
parse是nlohamnn的静态函数,它能够解析json字符串,但是如果字符串为空,则会抛出异常;
异常捕获
try
{
std::string nullStr = "";
nlohmann::json js = nlohmann::json::parse(nullStr);
}
catch(nlohmann::json::parse_error e)
{
// ...自定义操作
}
catch(nlohmann::json::exception e)
{
// ...自定义操作
}
通过nlohmann::json::parse_error来捕获解析错误
JSON转结构体的基本规则
在http://t.csdnimg.cn/j4Xn4中,介绍了,json字符串与结构体(类)时,转换成员是可选择的。
在使用带初始值的宏时,json字符串还可以不包含 需要转换的成员。
nlohmann::json 完成json转结构体主要是依靠成员变量名称和变量类型的。
首先我们知道json由两种数据结构组成——对象(“{ }”)和数组(“[ ]”),其余就是键值对。
下面是转换时的对应规则
JSON | 结构体(类) |
数字 | int/float等 |
字串符 | string |
逻辑值 | bool |
对象 | struct(class) |
null | null |
数组 | vector |
在转换时会依照规则进行组装数据;
下面演示数组的转换:
#include "iostream"
#include "myStruct.h"
#include "json.hpp"
#include "vector"
using namespace std;
struct People
{
// std::string name = "asd";
// int age = 123;
// std::string sex = "man";
// int height = 190;
std::string name = "asd";
int age = 1;
std::string sex = "dfg";
int height = 2;
NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(People, name, age)
};
int main(void)
{
std::vector<People> ve;
for (int i = 1; i < 10; i++)
{
People pe;
ve.emplace_back(pe);
}
nlohmann::json js = ve;
cout << js.dump() << endl;
return 0;
}
执行结果
[{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"}]
转换函数get<>()
在使用转结构体函数get<>()时,是最容易发生崩溃的。为什么?
在上一节中,我们知道在json中值也是有类型的,同时我们也知道 转换是将成员变量名与键名进行对应,在这个对应中,如果json的值类型与对应的结构体成员变量的类型不一致,怎会出现崩溃和报错