1

我一直在尝试使用以下代码,取自示例,我不得不将 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 * *价值)

很抱歉,我已经发布了类似的问题,因为我几天来一直试图找到一种从套接字解析 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++,当然我也在那里使用指针。无论哪种方式,通过阅读一些 c++ 的 json 解析器,我发现它们更容易理解。

提前致谢

4

2 回答 2

1

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

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

jobj = json_tokener_parse(buf);

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

于 2015-04-08T09:45:27.300 回答
0

您的代码中显示的唯一取消引用是

*jobj = json_tokener_parse(buf);

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

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

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

于 2015-04-08T06:38:34.257 回答