gpt4 book ai didi

c - 使用cJSON读取JSON数组元素的问题

转载 作者:行者123 更新时间:2023-11-30 14:36:57 25 4
gpt4 key购买 nike

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

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

输出https://jsonlint.com/验证

第一个数据:

{
"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

代码:

#include "stdio.h"
#include "cJSON/cJSON.h"
#define REASON_INPUTVALUES_JSONPARSER_ERROR 21
//
///home/ccode/jsonchk.c
//gcc -L cJSON/ -lcjson jsonchk.c -o jsonchk.o
//export LD_LIBRARY_PATH=/home/ccode/cJSON
//

int parsejsonstr(void)
{
char jsoninput[500] = { 0 };
snprintf( (char *)jsoninput, sizeof(jsoninput),
"{\"NPCDevMoveReqList\":[{\"srcPid\":\"1\",\"destPid\":\"2\",\"devIdxs\":[\"1\",\"2\",\"3\"]},{\"srcPid\":\"1\",\"destPid\":\"3\",\"devIdxs\":[\"4\",\"5\",\"6\"]}]}");

printf("jsonstrinput>>:%s\n", jsoninput);


cJSON *jSON_devmove_data = cJSON_Parse(jsoninput);
if(jSON_devmove_data == NULL)
{
printf("\nError moveDevicesJsonArray mvJsonArrayBuf:%.24s mvJsonArrayBuf:%d main parsefail",
jsoninput, strlen(jsoninput));
return REASON_INPUTVALUES_JSONPARSER_ERROR;
}

cJSON * json_devmove_reqlist = cJSON_GetObjectItem(jSON_devmove_data, "NPCDevMoveReqList");
if(jSON_devmove_data == NULL)
{
printf("\nError moveDevicesJsonArray mvJsonArrayBuf:%.24s mvJsonArrayBuf:%d reqlist parsefail",
jsoninput, strlen(jsoninput));
return REASON_INPUTVALUES_JSONPARSER_ERROR;
}

int idx=0;
cJSON* jsrcPid = NULL;
cJSON* jdstPid = NULL;
cJSON* jdevIdxs = NULL;

for (idx = 0 ; idx < cJSON_GetArraySize(json_devmove_reqlist) ; idx++)
{
cJSON * json_subitem = cJSON_GetArrayItem(json_devmove_reqlist, idx);
if(json_subitem == NULL)
{
printf("\nError moveDevicesJsonArray mvJsonArrayBuf:%.24s mvJsonArrayBuf:%d idxsub parsefail",
jsoninput, strlen(jsoninput));
return REASON_INPUTVALUES_JSONPARSER_ERROR;
}

jsrcPid = cJSON_GetArrayItem(json_subitem, "srcPid");
jdstPid = cJSON_GetArrayItem(json_subitem,"destPid");
jdevIdxs = cJSON_GetArrayItem(json_subitem, "devIdxs");

printf("\n>>>moveDevicesJsonArray aryidx:%d src:%s dst:%s devidxs:%s <<\n",
idx, jsrcPid, jdstPid, jdevIdxs);
}


return 1;
}


void main(void)
{
int rval = parsejsonstr();
printf("jsonparsestr call res>>:%d\n", rval);
}

输出:

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

>>>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) <<

最佳答案

您的主要问题是您正在调用 cJSON_GetArrayItem而不是cJSON_GetObjectItem 。这些属性是对象的一部分,而不是直接包含数组的一部分。切换调用,您显示的代码大部分都可以工作。

其他次要的东西:

  • 您失踪了#include <string.h>对于 strlen .
  • 您正在使用%d当打印 strlen 的结果时。自 strlen返回 size_t ,你应该使用%zu相反。
  • 您正在打印jsrcPid , jdstPid ,和jdevIdxs作为字符串( %s ),但它们实际上是 struct cJSON * ,所以你应该使用 %p并转换到 (void*) .

如果您启用了警告,编译器可能会告诉您所有这些信息。使用 GCC 时,始终使用标志 -Wall -Wextra -Wpedantic 。另外,通过给出 -std=c90 之一来告诉编译器您使用哪种 C 标准。 , -std=c99 , -std=c11-std=c18 .

关于c - 使用cJSON读取JSON数组元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57743871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com