你好,我以前从未使用过json-c,我正在尝试分析这个json文件:
{
"result": {
"schedules": [
{
"message": "2 mn",
"destination": "La Defense (Grande Arche)"
},
{
"message": "6 mn",
"destination": "La Defense (Grande Arche)"
},
{
"message": "11 mn",
"destination": "La Defense (Grande Arche)"
},
{
"message": "15 mn",
"destination": "La Defense (Grande Arche)"
}
]
},
"_metadata": {
"call": "GET /schedules/metros/1/berault/A",
"date": "2021-12-19T12:36:19+01:00",
"version": 4
}}
我正试图获得";消息";键转换为4个不同的变量,并将它们打印为字符串,如下所示:
message=2分钟
message2=6分钟
message3=11分钟
2message4=15分钟
1
这是我的代码:
#include <json-c/json.h>
#include <stdio.h>
int main(int argc, char **argv) {
FILE *fp;
char buffer[1024];
struct json_object *parsed_json;
struct json_object *message;
struct json_object *message2;
struct json_object *message3;
struct json_object *message4;
fp = fopen("test.json","r");
fread(buffer, 2048, 1, fp);
fclose(fp);
parsed_json = json_tokener_parse(buffer);
json_object_object_get_ex(parsed_json, "message", &message);
json_object_object_get_ex(parsed_json, "message", &message2);
json_object_object_get_ex(parsed_json, "message", &message3);
json_object_object_get_ex(parsed_json, "message", &message4);
printf("Message: %sn", json_object_get_string(message));
printf("Message: %sn", json_object_get_string(message2));
printf("Message: %sn", json_object_get_string(message3));
printf("Message: %sn", json_object_get_string(message4));
}
但由于我的json与教程中的结构不同,所以它不起作用,并返回给我这个:
Message: (null)
Message: (null)
Message: (null)
Message: (null)
Process finished with exit code 0
非常感谢您的建议!
第一个问题是尝试将1个大小为2048
的元素读取到大小为1024
的缓冲区中。您应该读取大小为1
的元素,并且读取的字节数不要超过缓冲区中的可用空间。
下一个问题是,您尝试在不使用null终止所读内容的情况下解析所读内容。fread
不会假定您正在处理字符串,也不会自动执行此操作。
第三个问题是,在尝试访问各个元素之前,您没有查找消息数组。
我对这个库了解不多,所以我将把它留给内存泄漏。你必须阅读文档才能解决这个问题。它将正确地进行查找:
#include <stdio.h>
#include <json-c/json.h>
int main() {
char buffer[1024];
FILE *fp = fopen("test.json", "r");
size_t bytes_read = fread(buffer, 1, sizeof buffer - 1, fp);
fclose(fp);
if(bytes_read > 0) {
buffer[bytes_read] = ' ';
json_object *parsed_json = json_tokener_parse(buffer);
json_object *result, *schedules;
if(json_object_object_get_ex(parsed_json, "result", &result)) {
if(json_object_object_get_ex(result, "schedules", &schedules)) {
array_list *sched_arr = json_object_get_array(schedules);
printf("elements = %zun", sched_arr->length);
for(size_t idx = 0; idx < sched_arr->length; ++idx) {
json_object *message = array_list_get_idx(sched_arr, idx);
printf("Message: %sn", json_object_get_string(message));
}
// free the array. Perhaps done like this but please read the
// doc:
sched_arr->free_fn(sched_arr->array);
}
}
// free parsed_json, please read the doc
}
}