赞
踩
https://edu.csdn.net/course/detail/36074
https://edu.csdn.net/course/detail/35475
C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互。C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接。考虑到此项目将会有大量JSON数据需要处理,避免不了重复性的拆分拼接。所以打算封装一套C++结构体对象转JSON数据、JSON数据直接装C++结构体对象的接口,类似于数据传输中常见的序列化和反序列化,以方便后续处理数据,提高开发效率。
Json2Object(inJsonString, outStructObject)
,或者Object2Json(inStructObject, outJsonString)
先上单元测试代码
TEST_CASE("解析结构体数组到JSON串", "[json]") { struct DemoChildrenObject { bool boolValue; int intValue; std::string strValue; /*JSON相互转换成员变量声明(必需)*/ JSONCONVERT2OBJECT_MEMEBER_REGISTER(boolValue, intValue, strValue) }; struct DemoObjct { bool boolValue; int intValue; std::string strValue; /*嵌套的支持JSON转换的结构体成员变量,数组形式*/ std::vector< DemoChildrenObject> children; /*JSON相互转换成员变量声明(必需)*/ JSONCONVERT2OBJECT_MEMEBER_REGISTER(boolValue, intValue, strValue, children) }; DemoObjct demoObj; /*开始对demoObj对象的成员变量进行赋值*/ demoObj.boolValue = true; demoObj.intValue = 321; demoObj.strValue = "hello worLd"; DemoChildrenObject child1; child1.boolValue = true; child1.intValue = 1000; child1.strValue = "hello worLd child1"; DemoChildrenObject child2; child2.boolValue = true; child2.intValue = 30005; child2.strValue = "hello worLd child2"; demoObj.children.push_back(child1); demoObj.children.push_back(child2); /*结束对demoObj对象的成员变量的赋值*/ std::string jsonStr; /*关键转换函数*/ REQUIRE(Object2Json(jsonStr, demoObj)); std::cout << "returned json format: " << jsonStr << std::endl; /*打印的内容如下: returned json format: { "boolValue" : true, "children" : [ { "boolValue" : true, "intValue" : 1000, "strValue" : "hello worLd child1" }, { "boolValue" : true, "intValue" : 30005, "strValue" : "hello worLd child2" } ], "intValue" : 321, "strValue" : "hello worLd" } */ DemoObjct demoObj2; /*关键转换函数*/ REQUIRE(Json2Object(demoObj2, jsonStr)); /*校验转换后的结构体变量中各成员变量的内容是否如预期*/ REQUIRE(demoObj2.boolValue == true); REQUIRE(demoObj2.intValue == 321); REQUIRE(demoObj2.strValue == "hello worLd"); REQUIRE(demoObj2.children.size() == 2); REQUIRE(demoObj.children[0].boolValue == true); REQUIRE(demoObj.children[0].intValue == 1000); REQUIRE(demoObj.children[0].strValue == "hello worLd child1"); REQUIRE(demoObj.children[1].boolValue == true); REQUIRE(demoObj.children[1].intValue == 30005); REQUIRE(demoObj.children[1].strValue == "hello worLd child2"); }
本次我们只关注怎么友好地在结构体与Json字符串之间进行转换,而不深入关注JSon字符串具体如何与基本数据类型进行转换。这个已经有不少的第三方库帮我们解决这个问题,如cJSON、Jsoncpp、rapidjson,不必再重复造轮子。
此次我们选择了JsonCPP作为底层的JSON解析支持,如果想替换成其他三方库也比较简单,修改对应嵌入的内容即可。
我们的目标是实现两个接口:
Json2Object(inJsonString, outStructObject)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。