待封装json格式
{
"method": "report",
"clientToken": "clientToken-18b42b4ee12",
"params": {
"date1": 1,
"date2": 2,
"date3": 3
}
}
封装API函数:
/******************************************************************************
* @ 函数名 : mqtt_date_pub_json
* @ 功 能 : 将rt_uint16_t数据通过json包格式多个发送
* @ 参 数 : date1 变量值
* date2 变量值
* date3 变量值
* @ 返回值 : 无
******************************************************************************/
void mqtt_date_pub_json(rt_uint16_t date1 ,rt_uint16_t date2 ,rt_uint16_t date3)
{
cJSON *root;
char *str=NULL;
/* 创建一个JSON数据对象(链表头结点) */
cJSON *cupload = cJSON_CreateObject();
/* 创建int类型数据 */
cJSON *cdate1 = cJSON_CreateNumber(date1);
cJSON *cdate2 = cJSON_CreateNumber(date2);
cJSON *cdate3 = cJSON_CreateNumber(date3);
/* 创建一个JSON数据对象(链表结点) //创建JSON对象,{}扩起来的*/
cJSON *cparams = cJSON_CreateObject();
/* 创建 "date": cdate键值对,加入到 cparams对象中*/
cJSON_AddItemToObject(cparams, "date1", cdate1);
cJSON_AddItemToObject(cparams, "date2", cdate2);
cJSON_AddItemToObject(cparams, "date3", cdate3);
/* 创建字符串类型数据 */
cJSON *cclientToken = cJSON_CreateString("clientToken-18b42b4ee12");
cJSON *creport = cJSON_CreateString("report");
/* 加入到JSON数据对象cupload */
cJSON_AddItemToObject(cupload, "method", creport);
cJSON_AddItemToObject(cupload, "clientToken", cclientToken);
cJSON_AddItemToObject(cupload, "params", cparams);
/* 转换为标准JSON数据格式 */
str=cJSON_Print(cupload);
rt_kprintf("cjson:%s",str);
/* 释放str内存 */
cJSON_free(str);
/* 删除json对象,释放内存 */
cJSON_Delete(cupload);
}
待解析json格式
{
"method": "report",
"clientToken": "clientToken-18b42b4ee12",
"params": {
"date1": 1,
"date2": 2,
"date3": 3
}
}
解析API函数:
/******************************************************************************
* @ 函数名 : cat1_Analysis
* @ 功 能 : 将cjson数据包解析成数据
* @ 参 数 : 无
* @ 返回值 : 无
******************************************************************************/
/*
{
"method": "report",
"clientToken": "clientToken-18b42b4ee12",
"params": {
"date1": 1,
"date2": 2,
"date3": 3
}
*/
void cat1_Analysis()
{
/* json_str为模拟需要解析的json数据包 */
char *json_str =" {\"method\":\"report\",\"clientToken\": \"clientToken-18b42b4ee12\",\"params\":{\"date1\": 1,\"date2\": 2,\"date3\": 3}}";
char *str=NULL;
rt_uint8_t date;
cJSON *cjson_data;
cjson_data = cJSON_Parse(json_str);//将json字符串转化成CJSON结构体类型的数据
if(!cjson_data)
{
//转换错误则退出解析
rt_kprintf("json phase error%s\r\n",cjson_data);
cJSON_Delete(cjson_data);
return;
}
/*将"params"成员 放入cparams*/
cJSON* cparams = cJSON_GetObjectItem(cjson_data,"params");
if(cparams)
{
/* 将"params"成员里面的"date1"转换为标准JSON数据格式 */
str = cJSON_Print(cJSON_GetObjectItem(cparams,"date1"));
/* 将str转换int类型*/
date= atoi(str);
if(date)rt_kprintf("date:%d\r\n",date);
/* 释放str内存*/
cJSON_free(str);
str = cJSON_Print(cJSON_GetObjectItem(cparams,"date2"));
date= atoi(str);
if(date)rt_kprintf("date2:%d\r\n",date);
cJSON_free(str);
str = cJSON_Print(cJSON_GetObjectItem(cparams,"date3"));
date= atoi(str);
if(date)rt_kprintf("date3:%d\r\n",date);
cJSON_free(str);
}
else
{
rt_kprintf("str phase error\r\n");
}
/* 删除json对象,释放内存 */
cJSON_Delete(cjson_data);
}
屏蔽主函数里面的打印函数。打开打印台得到传感器测得的距离值
1)不管是封装还是解析一定要释放内存,否者会一直申请内存,最后内存溢出。
2)调试的时候可以用msh里面输入free查询内存使用情况。
3)当每次运行封装或者解析API函数,发现可用内存一直在变小,就肯定是cjson的内存没有释放。
4)一定一定记住释放内存,非常重要。