c - 带有 json-c 库的 C 语言 JsonParser | json_object_object_get(...) 未声明

标签 c json json-lib

我是新来的,尝试实现一个 Json 解析器。 我找到了 Json 解析器程序的教程 ( https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/ )。

所以我有一个像这样的 Json 文件输入:

{ "DefaultTest": "SS",
    "Send": { 
    "ip_hl": 4,
    "ip_v": 4,
    ....
    }
}

我使用教程中的代码 ( https://linuxprograms.wordpress.com/2010/08/19/json_parser_json-c/ ) 并尝试理解这一代码。但我收到一个错误,该方法 json_object_object_get_get(jobj, key) 未声明

因此,找到一个 Wibesite ( https://json-c.github.io/json-c/json-c-0.10/doc/html/deprecated.html ),其中包含 json-lib 的弃用列表。在此,我应该使用 json_object_object_get_ex

如果我使用该方法,我会收到此警告:赋值使指针来自整数而不进行强制转换 [-Wint-conversion] jobj = json_object_object_get_ex(jobj, key, NULL);

这是什么意思?我该如何修复它? 我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <json/json.h>

void json_parse(json_object * jobj) {
    enum json_type type;

    json_object_object_foreach(jobj, key, val)
    {
        printf("type: %d\n", type);
        type = json_object_get_type(val);

        switch (type) {
        case json_type_boolean:
        case json_type_double:
        case json_type_int:
        case json_type_string:
//          print_json_value(val);
            break;

        case json_type_object:
            printf("json_type_objectn");

//          jobj = json_object_object_get(jobj, key);
            jobj = json_object_object_get_ex(jobj, key, NULL);
            json_parse(jobj);
            break;

        case json_type_array:
//          printf("json_type_arrayn");
//          json_parse_array(jobj,key);
            break;

        }
    }
}

int main() {
    char *path = "../Paketspezifikationen/Default-File/DefaultConfig2.json";
    FILE *fp;
    char *data = NULL;

    if ((fp = fopen(path, "rb")) == NULL) {
    } else if (fseek(fp, 0, SEEK_END) != 0) {
        fclose(fp);
    } else {
        long size = ftell(fp);
        if (size > 0 && (data = (char *) malloc(size + 1)) != NULL) {
            fseek(fp, 0, SEEK_SET);
            if (fread(data, 1, size, fp) != (size_t) size) {
                free(data);
                data = NULL;
            } else {
                data[size] = '\0';
            }
        }
        fclose(fp);
    }
    printf("JSON string: %sn", data); // return data

    json_object * jobj = json_tokener_parse(data);

    json_parse(jobj);
}

在 Main 中,我首先读取 Json 文件并将其存储在字符串中,然后尝试从那里获取所有键和值。所以我使用 json 解析器。

希望你能帮助我。

最佳答案

json_object_object_get_ex() 函数返回一个 json_bool (实际上是一个 int),指示是否在父 JSON 中找到给定的键对象,因此您不能将函数返回值分配给 jobj,它是一个指针:这就是警告的来源。

由于在您的代码中您已经有一个指向与给定键对应的 JSON 对象的指针(在 val 变量中),因此您可以通过避免调用 来更简单地实现您想要的目标>json_object_object_get_ex() 并调用 json_parse(val)

关于c - 带有 json-c 库的 C 语言 JsonParser | json_object_object_get(...) 未声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374815/

相关文章:

c++ - 理解 UMDH 比较输出

c - DECLARE_PER_CPU 变量存储在内核中的什么位置

c - 循环中的 opencl 运行时错误 (Clenqueuewritebuffer)

javascript - 将 json 数组格式化为图表输入

python - Django - 如何在序列化的 QuerySet 中包含带注释的结果?

c# - 这段代码中的 IEventRepository 是什么? Resolver.resolve( ) 是做什么的?

java - 如何在运行时从 bean 到 json 排除属性

Java Json 解析器

c - 我试图从 c 中的文件中读取一行并动态分配内存,但结果总是不好

java - Xml 到 JSON 单值数组处理