1

我正在使用 json-c 库。尝试在 C 中解析 json 文件时遇到两个问题。

如果我尝试按原样解析文件,则会在json_object_object_foreach().

但是,如果我删除了 json 文件开头和结尾的方括号,它可以工作,但只解析第一个对象。我想解析整个 json 文件。

这是我的代码:

int ParseJson(const char *file)                                                                                                                                                             
{                                                                               
            char *json;                                                                 
            int fd;                                                                     
            struct json_object *obj;                                                    
            struct stat st;                                                             

            fd = open(file, O_RDONLY);                                                  
            json = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);               
            close(fd);                                                                  

            obj = json_tokener_parse(json);                                             

            json_object_object_foreach(obj, key, val) {                                 
                printf("key = %s value = %s\n",key, json_object_get_string(val));       
            }                                                                           

            return 0;                                                                       
}

这是我的 json 文件:

[{
        "test_1": "min",
        "test_2": "max",
        "test_3": "val",
        "test_4": "res",
        "test_5": "var",
        "test_6": "hal"
    }, {
        "fetch_1": 300.00,
        "fetch_2": 100.000,
        "fetch_3": 0.000000,
        "fetch_4": 0.000000,
        "fetch_5": 20.00
    }, {
        "fetch_1": 250.00,
        "fetch_2": 310.000,
        "fetch_3": 3.000000,
        "fetch_4": 7.000000,
        "fetch_5": 18.00
    }, {
        "fetch_1": 450.00,
        "fetch_2": 678.000,
        "fetch_3": 3.000000,
        "fetch_4": 3.000000,
        "fetch_5": 89.00
    }, {
        "fetch_1": 300.00,
        "fetch_2": 100.000,
        "fetch_3": 7.000000,
        "fetch_4": 67.000000,
        "fetch_5": 50.00
    }, {
        "fetch_1": 900.00,
        "fetch_2": 800.000,
        "fetch_3": 6.000000,
        "fetch_4": 5.000000,
        "fetch_5": 30.00
}]
4

1 回答 1

4

你问关于 json-c 的问题有点好笑,这是我不久前为了自己的目的才拿起的。无论如何,问题肯定是@Myst 在评论中描述的。

我能够复制您描述的问题,并且在调试器下运行程序立即表明在迭代期间发生了段错误,而不是在解析期间发生。

再仔细看看代码,根据包的命名约定,函数(实际上是宏)json_object_object_foreach()被指定用于表示 JSON 对象的对象,而不是 JSON 数组。这就是名称中第二个“对象”的意义。您不得将该宏应用于表示 JSON 数组的对象,就像您尝试在输入中的顶级 JSON 结构是数组时所做的那样。因此,您必须先测试您拥有的对象类型,然后再确定如何检查它。

您可以通过json_object_get_type()或确定您拥有的对象的类型json_object_is_type()。对于顶级数组,您可以通过 获取数组长度json_object_array_length(),并使用普通for循环遍历索引范围,通过 检索元素json_object_array_get_idx()。我目前没有看到任何更好的选择,但也许对图书馆更有经验的人会提供一个。

于 2017-05-03T22:31:57.187 回答