CJSON的使用--处理多个相同类型数据(数组)的问题

该博客介绍了如何使用CJSON库在嵌入式系统中处理和交互多个相同类型的数据(数组)。通过创建和解析JSON对象,实现了从下位机接收协议配置信息并将其转化为JSON格式,然后发送到WEB端进行展示,同时展示了从WEB接收到JSON数据后解析并更新协议配置的过程。
摘要由CSDN通过智能技术生成

CJSON的使用–处理多个相同类型数据(数组)的问题

	最近的嵌入式项目使用到了CJSON的组包、解包,用来处理多个相同类型的数据、数组。
	数据格式如下:	
typedef struct{	
	char Enable;   			//协议是否使能
	char Index;    			//协议索引号
	char Len;         		//协议长度
	char Head[10];			//协议头
	}Type;

Type	Info[50];			//协议配置信息,共50条协议

如上述结构体所示,需要用cjson的格式对其进行打包、解包,以完成下位机和WEB之间的交互,具体实现方法如下:

//1、函数功能:从下位机获取协议配置信息并转存 buf是接收到的数据  len是接收到的数据长度
void GetInfo(char *buf,int len){	
		char *response_ptr = NULL;
		cJSON *pSend_root = NULL;
		cJSON *datainfo = NULL;
		int i,j,k;
		memset(&Info[0].Enable,0x00,650);	//先清空数据	所有协议的总字节长度为650
		k = 0;
		for(i = 0 ; i < 50 ; i++)		//开始转存数据
		{	
			Info[i].Enable = buf[k++];
			Info[i].Index = buf[k++];
			Info[i].Len = buf[k++];
			for(j = 0 ; j < 10 ; j++)
			{
				Info[i].Head[j] = buf[k++];
			}
		}
		pSend_root =  cJSON_CreateObject(); //创建根
		cJSON_AddNumberToObject(pSend_root,"state",0);//state为0表示接收完成
		response_ptr = cJSON_PrintUnformatted(pSend_root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格
		memcpy(ResponsePtr,response_ptr,strlen(response_ptr));//拷贝到发送区,最终会发送到WEB,表示数据接收已完成
		cJSON_Delete(pSend_root);			//释放根
		free(response_ptr);				//释放内存
}
//2、函数功能:将接收到的数据组json包,发送给WEB展示
void doGetInfo(){
		char *response_ptr = NULL;
		cJSON *pSend_root = NULL;
		cJSON *Sendinfo = NULL;
		int i,j;
		memset(ResponsePtr,0x00,sizeof(ResponsePtr));//先清空发送区

		pSend_root =  cJSON_CreateObject(); //创建根
		Sendinfo=  cJSON_CreateArray(); // 创建Sendinfo数组
		cJSON_AddItemToObject(pSend_root, "Sendinfo", Sendinfo);//数组添加到根
		for(i = 0 ; i < 50; i++)//开始打包数据
		{
			cJSON *SendList  = NULL;
			SendList =  cJSON_CreateObject(); // 创建SendList 
			cJSON_AddNumberToObject(SendList,"Enable",Info[i].Enable);	
			cJSON_AddNumberToObject(SendList,"Index",Info[i].Index);					  
			cJSON_AddNumberToObject(SendList,"Len",Info[i].Len);			
			cJSON_AddItemToObject(SendList, "Head",cJSON_CreateIntArray(Head[i],Len[i]));//创建数组对象并放入SendList
			cJSON_AddItemToArray(Sendinfo, SendList);//SendList放入Sendinfo数组
		}
		response_ptr = cJSON_PrintUnformatted(pSend_root);//将cJSON结构体转换为字符串(不带格式)不进行换行和空格
		memcpy(ResponsePtr,response_ptr,strlen(response_ptr));//拷贝到发送区,最终发送到WEB进行数据展示
		cJSON_Delete(pSend_root);			//释放根
		free(response_ptr);				//释放内存
}
//3、函数功能:WEB进行协议配置,函数解析json中的数据后发送到下位机 receive是接收到的json格式数据
static void SetInfo(void *receive){
	int i,j;
	char SendMsg[800] = {0x00};//发送数据包
	int MsgLen = 0;	//发送数据包长度
	//开始解json	
	cJSON *date;
	cJSON *root = cJSON_Parse((const char *)receive);
	cJSON *value = cJSON_GetObjectItem(root, "Info");
	if (value == NULL) return;		// 为空时返回
	cJSON *setinfo=value->child;
	for(i = 0 ; i < 50; i++)
	{	
		date = cJSON_GetObjectItem(setinfo,"Enable");					
		Info[i].Enable = date->valueint;
		date = cJSON_GetObjectItem(setinfo,"Index");					
		Info[i].Index = date->valueint;	
		date = cJSON_GetObjectItem(setinfo,"Len");						
		Info[i].Len = date->valueint;
		date = cJSON_GetObjectItem(setinfo,"Head");	
		for(j=0;j<cJSON_GetArraySize(date);j++)//解析协议头数组
			{
				cJSON *subitem = cJSON_GetArrayItem(date, j);
				Info[i].Head[j] = subitem->valueint;
			}
		setinfo = info->next;
	}

	cJSON_Delete(root);        		 //释放空间
	
	memcpy(&SendMsg,&Info[0].Enable,650);//拷贝到发送数组
	MsgLen=650;
	SetSendTo(SendMsg,MsgLen);//发送到下位机进行设置
}

以上就是组json和解json的全过程,如果觉得这篇文章对您有帮助,欢迎点赞、评论、转发、收藏!您的支持是我创作的最大动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极崆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值