C++ JSON
文章目录
前言
在 C++ 中有许多第三方库可以解析 JSON,但是都不是很好用,不能像 Java 中的 gson 、 fastjson 一样直接把 JSON 直接转成对象。
找了许多库,找到了nlohmann/json: JSON for Modern C++使用起来比较方便,也踩了坑,来了解一下。
JSON 转对象
|
|
在 nlohmann/json 中,如果需要一个对象可以被解析需要实现 to_json 和 from_json 这两个方法。如果每个类都要写一遍那就很麻烦,所以提供了 NLOHMANN_DEFINE_TYPE_INTRUSIVE 这个宏来简化代码,但是这里有个坑,下文会说。
有了这个准备就可以使用 json::parse 把 JSON 字符串转成 json 对象,然后实用 json.get<T> 来把 JSON 转成对应的对象,这里需要传入要转换的模板。
对象转 JSON
|
|
要把对象转 JSON 字符串,可以通过 json.dump() 把对象转字符串。
处理没有 key 的情况
上面这样使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏来生成 to_json 和 from_json 方法非常方便,但是却有坑,它不能处理 key 不存在的情况,会直接抛异常。
这时候我们就需要自定义转换的逻辑了,也就是要写 to_json 和 from_json 两个方法
|
|
我们在 from_json 中对每个 key 先判断存不存在,存在才去获取 value ,这样就不会说 key 找不到了。
总结
C++ 中使用nlohmann/json: JSON for Modern C++来解析 JSON 相对其它库还是比较方便的,不用每次使用的时候都手动解析,但是和其它语言里的相比还是差了不少。
这里需要注意使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 的时候, key 如果不存在会直接抛异常。
解决这个问题可以自定义 from_json 和 to_json 来进行灵活的控制。