OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3503|回复: 3

STM32中关于使用cjson的问题

[复制链接]

41

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-12-4
在线时间
208 小时
发表于 2020-12-7 15:23:40 | 显示全部楼层 |阅读模式
本帖最后由 shengxiaozhu 于 2020-12-7 16:25 编辑

{
        "topic": "open_door",
        "addrlist": [1,2,3]         //0:表示开柜门;1~254:表示指定电池仓地址;需要开启多个时,将对应地址添加到数组中
}

怎么解析addrlist数组,得到1,2,3呢?

第一次使用cjson所有很多地方不是很清楚,请大佬指点!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-12-8 09:12:05 | 显示全部楼层
先获取数组长度cJSON_GetArraySize    在读出来 cJSON_GetArrayItem
回复 支持 1 反对 0

使用道具 举报

0

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-10-10
在线时间
131 小时
发表于 2020-12-8 14:39:56 | 显示全部楼层
本帖最后由 YukawaManabu 于 2020-12-8 15:07 编辑

代码大致这么个思想,随手写的。。。没试过编译会不会报错

然后内存分配和释放有个坑就是,如果根节点的对象 的内存被释放了,子节点对象会被他递归释放的,不需要手动再去释放,否则free的时候会空指针的

void printntab(int iCnt)
{
    int i = 0;
    for (i = 0; i < iCnt; i++)
    {
        printf("\t");
    }
}

//pJson:json对象
//iCnt:TAB缩进深度
void parseJson(cJSON *pJson, int iCnt)
{

    switch (pJson->type)
    {
    case cJSON_False:
    {
        printf("%s : %d\n", pJson->string, pJson->valueint);
    }
    break;
    case cJSON_True:
    {
        printf("%s : %d\n", pJson->string, pJson->valueint);
    }
    break;
    case cJSON_NULL:
    {
        printf("%s : NULL\n", pJson->string);
    }
    break;
    case cJSON_Number:
    {
        printf("%s : %d | %lf\n", pJson->string, pJson->valueint, pJson->valuedouble);
    }
    break;
    case cJSON_String:
    {
        printf("%s : %s\n", pJson->string, pJson->valuestring);
    }
    break;
    case cJSON_Array:
    {
        printf("%s : [%s]\n", pJson->string, pJson->valuestring);
    }
    case cJSON_Object:
    {
        int iSize = cJSON_GetArraySize(pJson);
        int i = 0;
        iCnt++;
        printntab(iCnt);
        if (pJson->string)
        {
            printf("%s : {\n", pJson->string);
        }
        else
        {
            printf("{\n");
        }

        //printf("%s : {\n", NULL == pJson->string ? "" : pJson->string);
        for (i = 0; i < iSize; i++)
        {
            printntab(iCnt);
            cJSON *pSub = cJSON_GetArrayItem(pJson, i);
            parseJson(pSub, iCnt);
        }
        printntab(iCnt);
        printf("}\n");
    }
    break;
    default:

        break;
    }
}

int num_arry[1000] = {0};

void JsonProcess(char *json)
{
    cJSON *item;
    cJSON *rcvpayload = cJSON_Parse((const char *)json);
   
    if (rcvpayload)
    {
        printf("\r\nget a json:\r\n");
        parseJson(rcvpayload, 0);

        cJSON *target = cJSON_GetObjectItem(rcvpayload, "addrlist");

        if (target)
        {
            int index = cJSON_GetArraySize(target);
            int cnt;

            for (cnt = 0; cnt++; cnt < index)
            {
                item = cJSON_GetArrayItem(target, cnt) ;               
                if (cJSON_Object == item->type) //如果对应键的值仍为cJSON_Object就递归调用parseJson
                    parseJson(item);
                else //值不为json对象就直接存储进数组并打印出值
                {
                    num_arry[cnt] = atoi(item->string);
                    printf("%s->", num_arry[cnt]);
                }
            }
        }

        cJSON_Delete(rcvpayload);
    }
}


回复 支持 反对

使用道具 举报

41

主题

96

帖子

0

精华

高级会员

Rank: 4

积分
659
金钱
659
注册时间
2017-12-4
在线时间
208 小时
 楼主| 发表于 2020-12-8 15:35:32 | 显示全部楼层
YukawaManabu 发表于 2020-12-8 14:39
代码大致这么个思想,随手写的。。。没试过编译会不会报错

然后内存分配和释放有个坑就是,如果根节点的 ...

专业啊,谢谢大佬。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 15:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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