其他分享
首页 > 其他分享> > CJSON的使用--处理多个相同类型数据(数组)的问题

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

作者:互联网

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]));//创建数组对象并放入BackCardList
			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,&BackCardInfo[0].BackcardEnable,650);//拷贝到发送数组
	MsgLen=650;
	SetSendTo(SendMsg,MsgLen);//发送到下位机进行设置
}

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

标签:Info,CJSON,response,--,cJSON,数组,root,ptr,pSend
来源: https://blog.csdn.net/weixin_48465965/article/details/119486506