2

您好,我以前从未使用过 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 个不同的变量并将它们打印为如下字符串:

消息 = 2 分钟 消息2
= 6 分钟消息
3 = 11 分钟
消息4 = 15 分钟

这是我的代码:

#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: %s\n", json_object_get_string(message));
  printf("Message: %s\n", json_object_get_string(message2));
  printf("Message: %s\n", json_object_get_string(message3));
  printf("Message: %s\n", json_object_get_string(message4));


}

但由于我的 json 与教程中的结构不同,因此它不起作用并返回给我:

Message: (null) 
Message: (null)
Message: (null)
Message: (null)

Process finished with exit code 0

任何建议高度赞赏!

4

1 回答 1

0

第一个问题是您尝试将具有 size 的 1 个元素读2048入具有 size 的缓冲区1024。您应该读取 size 的元素,1并且读取的字节数不要超过缓冲区中的空间。

下一个问题是您尝试解析您已阅读的内容,而不会终止您已阅读的内容。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] = '\0';

        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 = %zu\n", 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: %s\n", 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
    }
}
于 2021-12-19T12:50:39.733 回答