使用JsonCpp实现C++数据结构与Json格式的相互转换

 

在一个项目中,由于客户端与服务端程序各自采用编程平台有差别,

在两者进行Socket网络通信的时候,就面临数据包格式的一致性问题。

对于这种不同平台程序间的通信问题,

当然也可以使用protobuf,thrift等成熟的工具对数据进行序列化和反序列化处理。

但是由于客户端的框架代码基于原来Json格式,服务器则是C++数据结构格式,

两者都已经存在现成的框架代码,为了不做大的变动,就在服务器端对通信收发的数据进行格式转换,

也就是需要将C++数据结构与Json格式的数据互相转换。

本文是基于JsonCpp 0.6.0-rc2 版本对Json数据进行解析的。(附JsonCpp最新版本下载链接)

 

本文相关的完整代码已经打包上传CSDN,如需下载请点击下方链接 “JsonCpp的简易封装”

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
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值