搜索
bottom↓
回复: 6

利用库cjson自带的函数解析

[复制链接]

出0入0汤圆

发表于 2018-12-11 15:24:25 | 显示全部楼层 |阅读模式
再freertos操作系统下,利用CJSON的库函数解析接收的json协议字符串。
#{"DataType":"test","Info":"{\"MIN\":\"0.101\",\"MAX\":\"1.409\"}"}$
折腾了一上午遇到两个l问题:
1.经过大约50多次解析后,函数就不能正常解析,现象是直接显示没有接收到数据。
2.查网上帖子说是因为没有释放内存,但是我加上释放内存后,会出现Error:..\FREERTOS\portable\MemMang\heap_4.c,320
Error:..\FREERTOS\portable\MemMang\heap_4.c,321这两个错误提示
哪位高手用过cjson,请赐教。
下面是代码
bool ParseCmdJson(const char* pCmdJson)
{
  cJSON * pRoot = NULL,* pRoot2 = NULL;
        cJSON * pJsonNode = NULL;
        int len = 0;

        bool bRet = false;
        printf("\r\n%s \r\n",pCmdJson);
        if(strstr(pCmdJson,"#")!=NULL)
       pCmdJson=(pCmdJson+1);

            pJsonNode=pvPortMalloc(100);       
        /*Êý¾Ý°üÈ·Èϼì²é£¬*/
        pRoot = cJSON_Parse(pCmdJson);
        if(NULL == pRoot)
        {
                printf("cJSON_Parse:NULL\n");
                return bRet;
        }
       

  /*Ϊ½ÓÊÕÊý¾Ý¿ª±Ù»º´æÇø*/
//        memset(pDeviceInfo, 0, sizeof(DeviceInfo));

        // ÌáÈ¡type
        pJsonNode = cJSON_GetObjectItem(pRoot, "DataType");

        if (NULL != pJsonNode)
                {
                        printf("DataType:%s\r\n" ,pJsonNode->valuestring);
                }

        pJsonNode = cJSON_GetObjectItem(pRoot, "Info");       
                                               
        if (NULL != pJsonNode)
                {
//                        printf("Info:%s\r\n" ,pJsonNode->valuestring);
                         /*½âÎöµÚ¶þ¼¶*/
                                /*Êý¾Ý°üÈ·Èϼì²é£¬*/
                                pRoot2 = cJSON_Parse(pJsonNode->valuestring);
                                if(NULL == pRoot2)
                                {
                                        printf("cJSON_Parse_2:NULL\n");
                                        return bRet;
                                }
                               
             pJsonNode = cJSON_GetObjectItem(pRoot2, "ION_MIN");       
                                if (NULL != pJsonNode)
                                {
                                        printf("ion_min:%5.3f\r\n",atof(cJSON_GetObjectItem(pRoot2, "ION_MIN")->valuestring));       
                                }               
                               
             pJsonNode = cJSON_GetObjectItem(pRoot2, "ION_MAX");       
                                if (NULL != pJsonNode)
                                {
                                  printf("ion_max:%5.3f\r\n",atof(cJSON_GetObjectItem(pRoot2, "ION_MAX")->valuestring));               
                                }                                       
                                                       
                }       
               

                cJSON_Delete(pRoot);
             vPortFree(pRoot);
                uart1_clear();
                return bRet;
}

出0入0汤圆

发表于 2018-12-11 15:28:28 | 显示全部楼层
pJsonNode=pvPortMalloc(100);         多余, 很可能是你的泄露源.


cJSON_Delete(pRoot);     这个已经可以清空整个json链表了.
vPortFree(pRoot);           多余, 会造成double free.

出0入0汤圆

发表于 2018-12-11 15:29:53 | 显示全部楼层
pRoot2 = cJSON_Parse(pJsonNode->valuestring);
if(NULL == pRoot2)
{
    printf("cJSON_Parse_2:NULL\n");
    return bRet;
}

另外发现你有的地方直接就return了,  说好的cJSON_Delete呢?

出0入0汤圆

 楼主| 发表于 2018-12-11 15:42:17 | 显示全部楼层
kayatsl 发表于 2018-12-11 15:28
pJsonNode=pvPortMalloc(100);         多余, 很可能是你的泄露源.

你说的pJsonNode=pvPortMalloc(100);        和vPortFree(pRoot);一开始都没有添加,只是后来发现问题才加上的。

出0入0汤圆

 楼主| 发表于 2018-12-11 15:43:52 | 显示全部楼层
kayatsl 发表于 2018-12-11 15:29
pRoot2 = cJSON_Parse(pJsonNode->valuestring);
if(NULL == pRoot2)
{

这个return确实可能存在不合理性,再解析错误或者接受错误的时候可能会出问题

出0入0汤圆

发表于 2018-12-11 15:53:19 | 显示全部楼层
解析几十次之后解不出, 通常原因确实是不够内存.

但泄露源不一定是json本身, 最好能做个内存跟踪, freertos本身有工具跟踪

出0入0汤圆

发表于 2018-12-11 18:06:12 | 显示全部楼层
楼主,我之前也遇到了和你一样的问题,原因就是释放有问题,一定要保证pRoot= cJSON_Parse,和cJSON_Delete(pRoot)成对出现。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 09:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表