【问题标题】:Parse this specific json file解析这个特定的 json 文件
【发布时间】:2022-01-21 10:36:00
【问题描述】:

您好,我以前从未使用过 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 分钟
message2 = 6 分钟
message3 = 11 分钟
message4 = 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

非常感谢任何建议!

【问题讨论】:

  • char buffer[1024];fread(buffer, 2048, 1, fp); - 你看到问题了吗?让size_t bytes_read = fread(buffer, 1, sizeof buffer - 1, fp); if(bytes_read&gt;0) buffer[bytes_read ] = '\0';
  • 不同的 JSON 结构,不同的键和值在代码中获取。您不能复制粘贴代码来处理不同的 JSON 输入。
  • LilDev:答案有帮助吗?如果您想让我澄清任何事情,请尽管问。

标签: c json-c


【解决方案1】:

第一个问题是您尝试将大小为 2048 的 1 个元素读入大小为 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] = '\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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2013-06-27
    • 2021-10-12
    相关资源
    最近更新 更多