在一个项目中,由于客户端与服务端程序各自采用编程平台有差别,
在两者进行Socket网络通信的时候,就面临数据包格式的一致性问题。
对于这种不同平台程序间的通信问题,
当然也可以使用protobuf,thrift等成熟的工具对数据进行序列化和反序列化处理。
但是由于客户端的框架代码基于原来Json格式,服务器则是C++数据结构格式,
两者都已经存在现成的框架代码,为了不做大的变动,就在服务器端对通信收发的数据进行格式转换,
也就是需要将C++数据结构与Json格式的数据互相转换。
本文是基于JsonCpp 0.6.0-rc2 版本对Json数据进行解析的。(附JsonCpp最新版本下载链接)
本文相关的完整代码已经打包上传CSDN,如需下载请点击下方链接 “JsonCpp的简易封装”
下载上述代码之后进行解压,在VC++项目中包含解压的代码,
然后在需要的地方包含zdJsonWrap.h即可使用,例子如下:
#include "..\..\include\zdJson\zdJsonWrap.h"
ps:这里没有将JsonCpp编译成一个lib库,而是包含所有源代码,
如果需要用lib库的形式,请自行封装。
一)C++数据结构转换到Json
下面给出C++数据结构转换到Json格式的主要代码
int Struct2Json(const char *pStructIn, const Json::Value &stJsonDescIn, std::string &strJsonOut, Json::Value *pJsonResult)
{
Json::Value jvResult;
if(stJsonDescIn.empty()) return -1;
//根据json描述,获取数据结构成员
if(stJsonDescIn.isArray())
{
int nSize = stJsonDescIn.size();
for (int index = 0;index < nSize; index++)
{
const Json::Value &childValue = stJsonDescIn[index];
zdConstructValue(pStructIn, childValue, jvResult);
}
}
else if(stJsonDescIn.type()==Json::objectValue)
{
Json::Value::Members membs = stJsonDescIn.getMemberNames();
Json::Value::Members::iterator itr = membs.begin();
for(; itr != membs.end(); itr++)
{
std::string strName = *itr;
const Json::Value &jValue = stJsonDescIn[strName];
zdConstructValue(pStructIn, jValue, jvResult);
}//end of for
}
else
{
return -2;
}
//数据结构转换为Json描述输出
JsonRewriteValueTree(jvResult, strJsonOut);
if(pJsonResult) *pJsonResult = jvResult;
//JsonRewriteValueTree(jvResult, strJsonOut, "d:\\test_struct2json.json");
return 0;
}
以下函数,将对应C++数据类型转换到Json格式
//根据数据结构的json描述,构造json::value对象
int zdConstructValue(const char *pStructIn, const Json::Value &jValue, Json::Value &jvResul