N个消息包结构体转Json格式字符串,怎么设计可以减少代码量?

Darren_Rabbit 2015-12-10 02:10:51
问题描述:
结构体A,B,C,D……N,有N个结构体,每个结构体的成员(属性)不相同,如:
struct A
{
int a;
int b;
std::string c;
};

struct B
{
bool d;
std::string e;
};
现在需要实现的是,读取每一个结构体的属性值,然后将其转换为json格式字符串。

如:
A a,a.a=1,a.b=2,a.c="hello",转换为json格式的字符串为“{"a":1,"b":2,"c":"hello"}”.

如果只是一个结构体,只需要编写相应的函数就可以了。 但是,现在有 N个这样的结构体,从设计模式的角度出发,应该怎么设计比较好些,怎么设计可以减少代码量.

望大家不吝点拨,指点迷津,谢谢!
...全文
1208 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
疲惫小耳朵 2017-02-18
  • 打赏
  • 举报
回复
请问LZ后来实现了么?可否分享下呢?
Darren_Rabbit 2015-12-10
  • 打赏
  • 举报
回复
可能我上面说的不是很清楚,我现在上传代码,麻烦大家指点下,谢谢! 消息包:
//包头
struct MileageMsgHead
{	
	int msgBodyLenth;     			
	int msgType;					
	int msgVersion;						
};

//数据
struct MileageMsgBody
{	
	int airCardId;   
	int mileageNum;  
	int price;       
};

//消息包
struct NetPacketMileage
{
	MileageMsgHead	Header;		//包头
	MileageMsgBody  Body;    	//数据
};
对消息包进行处理的类:
class CNetPacket
{
public:
	CNetPacket(int msgType, int msgVersion, int airCardId, int mileageNum, int price);
public:
	void CreateMileageMsgBody(int airCardId, int mileageNum, int price);
	void CreateMileageMsgHead(int msgType, int msgVersion);
	std::string CreateMileageMsgBodyJsonString();
	std::string CreateMileageMsgHeadJsonString();
	std::string GetMileagePacketString();
private:
	NetPacketMileage mileagePacket;   
};
具体的实现代码:
CNetPacket::CNetPacket(int msgType, int msgVersion, int airCardId, int mileageNum, int price)
{
	CreateMileageMsgBody(airCardId, mileageNum, price);
	CreateMileageMsgHead(msgType, msgVersion);
}


void CNetPacket::CreateMileageMsgBody(int airCardId, int mileageNum, int price)
{ 
	memset(&mileagePacket.Body, 0, sizeof(mileagePacket.Body));
	mileagePacket.Body.airCardId = airCardId;
	mileagePacket.Body.mileageNum = mileageNum;
	mileagePacket.Body.price = price;
}


std::string CNetPacket::CreateMileageMsgBodyJsonString()
{
	//根节点
	Json::Value root;

	//根节点属性
	root["airCardId"] = Json::Value(mileagePacket.Body.airCardId);
	root["mileageNum"] = Json::Value(mileagePacket.Body.mileageNum);
	root["price"] = Json::Value(mileagePacket.Body.price);

	std::string strMsgBody = root.toStyledString();
	return strMsgBody;
}


void CNetPacket::CreateMileageMsgHead(int msgType, int msgVersion)
{
	mileagePacket.Header.msgType = msgType;
	mileagePacket.Header.msgVersion = msgVersion;
	std::string strMsgBody = CreateMileageMsgBodyJsonString();
	mileagePacket.Header.msgBodyLenth = strlen(strMsgBody.c_str());
}


std::string CNetPacket::CreateMileageMsgHeadJsonString()
{
	//消息长度占8位
	char cBodyLength[9];
	sprintf_s(cBodyLength, "%8d", mileagePacket.Header.msgBodyLenth); 
	std::string strBodyLength(cBodyLength);

	//消息类型占4为
	char cMsgType[5];
	sprintf_s(cMsgType, "%04d", mileagePacket.Header.msgType); 
	std::string strMsgType(cMsgType);

	//版本号占4位
	char cMsgVersion[5];
	sprintf_s(cMsgVersion, "%4d", mileagePacket.Header.msgVersion); 
	std::string strMsgVersion(cMsgVersion);	
	std::string strMsgHead = strBodyLength + strMsgType + strMsgVersion;
	return strMsgHead;
}


std::string CNetPacket::GetMileagePacketString()
{
	std::string strPacket = CreateMileageMsgHeadJsonString() + CreateMileageMsgBodyJsonString();
	return strPacket;
}
Darren_Rabbit 2015-12-10
  • 打赏
  • 举报
回复
这是我现在写好的正对一个消息包结构体转json的代码,如果有N个消息包,那么就需要重复上面的代码,写N个。显然是有问题的,因此想请大家给点思路,指点指点,谢谢!

3,405

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 设计模式
社区管理员
  • 设计模式
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧