在读取JSON数组元素时使用cJSON问题

在读取JSON数组元素时使用cJSON问题,c,cjson,C,Cjson,我正在编写一小段c代码,以使用gcc中的cJSON库解析json数组元素。 解析成功,但数组元素的打印结果为空。 不知道是什么问题 需要传递src、dst和设备索引列表的json数组输入 验证输出 第一个数据: { "NPCDevMoveReqList": [{ "srcPid": "1", "destPid": "2", "devIdxs": ["1", "2", "3"] }, {

我正在编写一小段c代码,以使用gcc中的cJSON库解析json数组元素。 解析成功,但数组元素的打印结果为空。 不知道是什么问题

需要传递src、dst和设备索引列表的json数组输入

验证输出

第一个数据:

{
    "NPCDevMoveReqList": [{
            "srcPid": "1",
            "destPid": "2",
            "devIdxs": ["1", "2", "3"]
        },
        {
            "srcPid": "1",
            "destPid": "3",
            "devIdxs": ["4", "5", "6"]
        }
    ]
} 
第二数据:

{
    "NPCDevMoveReqList": [{
        "srcPid": 1,
        "destPid": 2,
        "devIdxs": [1, 2, 3]
    }]
}
文件路径与编译方法

/home/ccode/jsonchk.c
/home/ccode/cJSON
gcc -L cJSON/ -lcjson jsonchk.c -o jsonchkary.o
export LD_LIBRARY_PATH=/home/ccode/cJSON
代码:

#包括“stdio.h”
#包括“cJSON/cJSON.h”
#定义原因\u输入值\u JSONPARSER\u错误21
//
///home/ccode/jsonchk.c
//gcc-L cJSON/-lcjson jsonchk.c-o jsonchk.o
//导出LD_库_路径=/home/ccode/cJSON
//
int parsejsonstr(void)
{
char jsoninput[500]={0};
snprintf((char*)jsoninput,sizeof(jsoninput),
“{\'NPCDevMoveReqList\\”:[{\'srcPid\':\'1\',\'destPid\':\'2\',\'devIdxs\':[\'1\',\'2\',\'3\',\'destPid\':\'3\',\'devIdxs\':[\'4\','5\','6\'}”);
printf(“jsonstrinput>>:%s\n”,jsoninput);
cJSON*jSON_devmove_data=cJSON_Parse(jsoninput);
if(jSON_devmove_data==NULL)
{
printf(“\n错误moveDevicesJsonArray mvJsonArrayBuf:%.24s mvJsonArrayBuf:%d主解析失败”,
jsoninput,strlen(jsoninput));
返回原因\输入值\ JSONPARSER\错误;
}
cJSON*json_devmove_reqlist=cJSON_GetObjectItem(json_devmove_数据,“NPCDevMoveReqList”);
if(jSON_devmove_data==NULL)
{
printf(“\n错误moveDevicesJsonArray mvJsonArrayBuf:%.24s mvJsonArrayBuf:%d reqlist parsefail”,
jsoninput,strlen(jsoninput));
返回原因\输入值\ JSONPARSER\错误;
}
int-idx=0;
cJSON*jsrcPid=NULL;
cJSON*jdstPid=NULL;
cJSON*jdevIdxs=NULL;
对于(idx=0;idx>>移动设备JSONARRAY aryidx:%d src:%s dst:%s设备DS:%s:%d\n”,rval);
}   
输出:

第一次尝试: [ccode]$/jsonchkary.o jsonstrinput>>:{“NPCDevMoveReqList”:[{“srcPid”:“1”,“destPid”:“2”,“devIdxs”:[“1”,“2”,“3”]},{“srcPid”:“1”,“destPid”:“3”,“devIdxs”:[“4”,“5”,“6”]}

>>移动设备JSONArray aryidx:0 src:(null)dst:(null)DeviceDXS:(null)>>移动设备JSONArray aryidx:1 src:(null)dst:(null)DeviceDXS:(null)>:1
第二次尝试:

[ccode]$ ./jsonchkary.o
jsonstrinput>>:{"NPCDevMoveReqList":[{"srcPid":1,"destPid":2,"devIdxs":[1,2,3]}]}

>>>moveDevicesJsonArray aryidx:0 src:(null) dst:(null) devidxs:(null) <<
[ccode]$./jsonchkary.o
jsonstrinput>>:{“NPCDevMoveReqList”:[{“srcPid”:1,“destPid”:2,“devIdxs”:[1,2,3]}]

>>>moveDevicesJsonArray aryidx:0 src:(null)dst:(null)devidxs:(null)您的主要问题是调用的是
cJSON\u GetArrayItem
,而不是
cJSON\u GetObjectItem
。属性是对象的一部分,而不是包含数组的直接部分。切换调用,您显示的代码基本上都能正常工作

其他,次要的东西:

  • 您缺少
    #包含
    strlen
  • 当打印
    strlen
    的结果时,您正在使用
    %d
    。由于
    strlen
    返回一个
    size\u t
    ,因此应改用
    %zu
  • 您正在将
    jsrcPid
    jdstid
    jdevIdxs
    打印为字符串(
    %s
    ),但它们实际上是
    struct cJSON*
    ,因此应该使用
    %p
    并强制转换为
    (void*)
如果启用了警告,编译器本可以告诉您所有这些。在使用GCC时,请始终使用标志
-Wall-Wextra-Wpedantic
。此外,通过给出
-std=c90
-std=c99
-std=c11
-std=c18
中的一个,告诉编译器您使用的是哪种C标准

>>>moveDevicesJsonArray aryidx:0 src:(null) dst:(null) devidxs:(null) <<

>>>moveDevicesJsonArray aryidx:1 src:(null) dst:(null) devidxs:(null) <<
jsonparsestr call res>>:1
[ccode]$ ./jsonchkary.o
jsonstrinput>>:{"NPCDevMoveReqList":[{"srcPid":1,"destPid":2,"devIdxs":[1,2,3]}]}

>>>moveDevicesJsonArray aryidx:0 src:(null) dst:(null) devidxs:(null) <<