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的全过程,如果觉得这片文章对您有帮助,欢迎评论、转发、收藏!您的支持是我创作的最大动力!