json -c解析 - 错误解除指向不完整类型的指针

时间:2015-04-08 04:41:18

标签: c json pointers json-c

我一直在尝试使用以下代码,从一个例子中,我不得不将json_object_object_get(struct json_object * obj,const char * key)更改为json_object_get_ex(struct json_object * obj,const char * key, struct json_object ** value)

对不起,我已经发布了类似的问题,因为我一直试图找到一种方法来解决json从套接字中解脱几天而且我变得绝望,但我已经做了一些工作和研究,我认为这很接近。我从编译下面得到的错误是:

server4.c:在函数'main'中: server4.c:62:错误:解除引用指向不完整类型的指针 server4.c:68:警告:赋值使用整数而不使用强制转换

    struct json_object *jobj, *val_jobj, *value;                                        
    char const *val;                                                              
    char buf[50];                                                                              
    fgets(buf, sizeof(buf), stdin);                                               
    printf("Input JSON : %s", buf);         
    char const *val;
    *jobj = json_tokener_parse(buf);
    if (is_error(jobj))    
    return (-1);  
    printf("Received JSON in String format : %s\n",    
    json_object_to_json_string(jobj));

  //Get the value for the key "name"      
    val_jobj = json_object_object_get_ex(jobj, "name", &value);    
    printf("Extracted value for command : %s\n",    

    //Get the string from the value of the key "name"                                         
    val = json_object_get_string(val_jobj);                                       
    printf("String value returned : %s\n", val);      

我看不出有什么问题,我不完全理解json-c是如何工作的,我对c ++也比较熟悉,当然我也在那里使用指针。无论哪种方式,通过一些json解析器阅读c ++,我发现它们更容易理解。

提前致谢

2 个答案:

答案 0 :(得分:1)

json_object结构是一种不透明的类型。它是私有的,指向它的指针不能被json-c库外的代码解除引用。

json_tokener_parse返回json_object *所以第62行应为:

jobj = json_tokener_parse(buf);

也就是说,不要取消引用jobj。

答案 1 :(得分:0)

您的代码中显示的唯一解除引用是

*jobj = json_tokener_parse(buf);

所以这必须是错误消息所引用的第62行。

您告诉编译器获取指针jobj的值(您从未为其指定值,因此存在错误编号1),并在该值所指向的空间中存储该值从json_tokener_parse(buf)返回。麻烦的是,你没有告诉编译器struct json_object是什么,所以jobj是指向一个不完整类型的指针 - 编译器不知道它有多大,也不知道它是什么组件由...制成。我假设你有一个JSON头文件,你忽略了#include

关于第68行的警告是一个单独的但很可能相关的问题,但是这一行是68(如果我的猜测62是正确的)是一个评论。