RT-Thread Studio之cjson软件包调试


前言

这篇文章主要是对rtthread studio 软件进行cjson软件包移植,调试总结。

一、RT-Thread Settings配置

添加软件包将cjson软件包添加到系统。
在这里插入图片描述

二、用户代码编写

1.Json 数据封装

待封装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);
 }


2.Json 数据解析

待解析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.Json 数据封装实验结果

在这里插入图片描述

在这里插入图片描述

2.Json 数据解析实验结果

在这里插入图片描述

在这里插入图片描述

四、注意事项

1)不管是封装还是解析一定要释放内存,否者会一直申请内存,最后内存溢出。
2)调试的时候可以用msh里面输入free查询内存使用情况。
3)当每次运行封装或者解析API函数,发现可用内存一直在变小,就肯定是cjson的内存没有释放。
4)一定一定记住释放内存,非常重要。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值