0

我是新来的,尝试实现一个 Json Parser。我找到了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/)并尝试理解这一点。但我得到一个错误,即 Method json_object_object_get_get(jobj, key) is not declared

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

如果我使用该方法,我会收到此警告:assignment makes pointer from integer without a cast [-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 文件并将其存储在 String 中,并尝试从那里获取我的所有键和值。所以我使用json解析器。

希望你能帮助我。

4

1 回答 1

0

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

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

于 2018-11-19T17:07:55.780 回答