现在的生活离不开网络,作为底层开发大军中小小的一员,不可避免遇到需要将底层采集到的数据通过网络发送给服务器进行分析展现,问题来了,,以什么可是将数据打包上去呢!!
基于两方开发的便捷,最终选择了CJSON。。。网上资料也挺全,很多同行们都用过,有经验可参考。
移植需要准备的东西不多,下载一个压缩包:
链接:https://github.com/DaveGamble/cJSON
只需要将其中的cJSON.c/cJSON.h添加到自己的工程之中去。
char *packJSON(void)//cJSON打包
{
cJSON *root,*staj,*desj,*repj;//cJSON指针
char *out;
root=cJSON_CreateObject();//创建root对象,返回值为cJSON指针
staj=cJSON_CreateObject();
desj=cJSON_CreateObject();
repj=cJSON_CreateObject();
cJSON_AddItemToObject(staj,"desired",desj);//向staj中添加一个对象desj
cJSON_AddStringToObject(desj,"message","cJSON Test!");//向desj中添加一个字符串,键为“message”,键值为“cJSON Test!”
cJSON_AddItemToObject(staj,"reported",repj);//向staj中添加一个对象repj
cJSON_AddNumberToObject(repj,"int_data",9999);//向repj中添加一个整数,键为 “int_data”,键值为“9999”
cJSON_AddNumberToObject(repj,"double_data",8.888);//向repj中添加一个浮点数,键为 “double_data”,键值为“8.888”
cJSON_AddItemToObject(root,"state",staj);//向root中添加一个对象staj
cJSON_AddNumberToObject(root,"version",4321);//向root中添加一个整数,键为 “version”,键值为“4321”
out=cJSON_Print(root);//将root转换为普通字符串,并返回指针
cJSON_Delete(root);//释放内存
mymfree_cjson(out);
return out;
}
参考了N多大神的文章,做一个简单的测试:
void Establish_test(void)
{
char *packtext;
char parsetext[]=
{"{\n"
"\"state\":{\n"
"\"desired\":{\n"
"\"message\":\"Hello,cJSON!\"\n"
"},\n"
"\"reported\":{\n"
"\"int_data\":1999,\n"
"\"double_data\":6.666\n"
"}\n"
"},\n"
"\"version\":1234\n"
"}\n"};
printf("\n\r");
parseJSON(parsetext);
packtext=packJSON();
parseJSON(packtext);
}
void parseJSON(char *text)//cJSON解析
{
int jversion=0;
int jint_data=0;
char *out=NULL;
char *jmessage=NULL;
double jdouble_data=0;
//cJSON指针定义
cJSON *json=NULL;
cJSON *jver=NULL,*jsta=NULL;
cJSON *jdes=NULL,*jrep=NULL;
cJSON *jmes=NULL,*jint=NULL,*jdou=NULL;
json=cJSON_Parse(text);
if(!json)
{
printf("Error before:[%s]\n\r",cJSON_GetErrorPtr());
}else
{
out=cJSON_Print(json);
printf("%s\n",out);
out=cJSON_PrintUnformatted(json);
printf("%s\n",out);
/*get the version of the json*/
jver=cJSON_GetObjectItem(json,"version");//获取JSON格式中,键值为“version”的对象
jversion=jver->valueint;
printf("(1)version:%d\n",jversion);
jsta=cJSON_GetObjectItem(json,"state");
jdes=cJSON_GetObjectItem(jsta,"desired");
jmes=cJSON_GetObjectItem(jdes,"message");
jmessage=jmes->valuestring;
printf("(2)The message of desired in state is :%s\n\r",jmessage);
jrep=cJSON_GetObjectItem(jsta,"reported");
jint=cJSON_GetObjectItem(jrep,"int_data");
jdou=cJSON_GetObjectItem(jrep,"double_data");
jint_data=jint->valueint;
jdouble_data=jdou->valuedouble;
printf("(3)int_data= %d,double_data= %f \n\r",jint_data,jdouble_data);
cJSON_Delete(json);
myfree_cjson(out);
}
}
下载验证多次,总是打印不出Json格式数据包,最终在大神的指导下,改了一下STM32F407的启动文件:
Stack_Size(栈)以及 Heap_Size(堆)的大小,编译测试后可打印出数据包。
下期更新--------上传服务器后的测试结果。如果有什么问题,忘大神指点,谢谢!!!!!
注: