首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用json-c解析json文件

使用json-c解析json文件
EN

Stack Overflow用户
提问于 2017-05-03 21:58:04
回答 1查看 8K关注 0票数 1

我正在使用json-c库。在用C语言解析json文件时,我遇到了两个问题。

如果我试图按原样解析该文件,那么在json_object_object_foreach()上就会出现分段错误。

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

这是我的代码:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
[{
        "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
}]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-03 22:31:57

问一下json-c有点好笑,我不久前为自己的目的而选择了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()检索元素。我目前没有任何更好的选择,但也许一个更有经验的图书馆将提供一个。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43770672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档