最近的文章都会跟刚刚发布的个人开源库有关: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。