C++优雅地读写json

最近的文章都会跟刚刚发布的个人开源库有关:GitHub - laiyongcong/cppfoundation: c++ basic library

c++读写json有很多库,比如jsoncpp、rapidjson等都相当优秀,但觉得还不是很优雅,每个字段都需要列举出来,并读入定义好的内存结构中,然后再进行使用,写json则是相反的过程。通常需要定义好结构体(或者定义一堆变量),然后逐个字段进行人工编码处理。

c++具有反射能力后,优雅地处理json成为了可能,比如下面的json:

{"a":1, "msg":"hello world", "arr":[1,2,3], "obj":{"x":4, "y":5, "z":6}}

 利用反射(可参考前面的文章c++实现反射功能-CSDN博客),我们可以定义结构体如下:

struct TestObj {
    REF_EXPORT int x;
    REF_EXPORT int y;
    REF_EXPORT int z;
};
struct TestStruct {
    REF_EXPORT int a;
    REF_EXPORT std::string msg;
    REF_EXPORT JsonArray<int> arr;
    REF_EXPORT TestObj obj;
};

按开源库说明配置工程,反射工具会自动生成反射代码并加入编译,然后我们可以这样读写它:

std::string strJson = "{\"a\":1, \"msg\":\"hello world\", \"arr\":[1,2,3], \"obj\":{\"x\":4, \"y\":5, \"z\":6}}";
TestStruct testS;
JsonBase::FromJsonString(&testS, strJson); //读取json的数据,反序列化到结构体中
testS.a = 100;
std::cout << JsonBase::ToJsonString(&testS) << std::endl;

我们需要做的只是根据json的结构特点,定义相应的数据结构,就可以顺利地利用开源库进行序列化和反序列化,可以说是相当优雅。当然上述结构体的字段应该在构造函数进行初始化。

对于变长的数组,我们可以使用JsonArray,对于不确定key的情况,我们可以使用JsonMap,其中JsonMap<String>应可以应对数值类型不确定的情况,当然此时的value不能是一个json 的object。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值