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