将名称/值对写入JSON对象

时间:2015-09-29 15:06:15

标签: c json

这个问题是关于项目中使用的两个与服务器相关的通信和加密的小功能。到目前为止,我只在C中编程,但由于项目的性质,我被指示通过Parson头文件(parson.h)使用JavaScript。

  

有人可以帮助我摆脱两个警告的代码   功能如下?详细说明将遵循代码。

通常我可以修复这些类型的东西,但现在我不确定问题出在哪里......

//Write a function to write a name/value pair to a given JSON value containing an object. The function prototype must be as follows:
void setNameValuePair(JSON_Value *rootValue, const char *name, const char *value) {
//This is of course the body of the function I wrote
json_object_set_string(rootValue, name, value);
}

//Write a function that reads the value associated with a specific name in a given JSON value containing an object. The function prototype must be as follows:
const char* getValueFromName(const JSON_Value *rootValue, const char *name) { 
//And here is my function body again
const char *value;  
value = json_object_dotget_string(rootValue, name);     
return value; 
}

在这两种情况下,我在技术上都没有收到错误,但有两个类似的警告(我认为存在差异),说明如下:

passing argument 1 of 'json_object_set_string' from incompatible pointer type [enabled by default]

passing argument 1 of 'json_object_dotget_string' from incompatible pointer type [enabled by default]

它声明上面是“默认启用”,但在测试功能时,我的程序崩溃了。

我收到一些评论建议我查看我从parson.h调用的函数并记下它们需要的参数 - 我发现了这一点,但我很感激帮助理解它:

/* dotget functions enable addressing values with dot notation in nested objects,
 just like in structs or c++/java/c# objects (e.g. objectA.objectB.value).
 Because valid names in JSON can contain dots, some values may be inaccessible
 this way. */
JSON_Value  * json_object_dotget_value  (const JSON_Object *object, const char *name);
const char  * json_object_dotget_string (const JSON_Object *object, const char *name);
JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name);
JSON_Array  * json_object_dotget_array  (const JSON_Object *object, const char *name);
double        json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
int           json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */

/* Creates new name-value pair or frees and replaces old value with a new one.
 * json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */
JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value);
JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string);
JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number);
JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean);
JSON_Status json_object_set_null(JSON_Object *object, const char *name);

我认为我不能扩展,解释或包含更多信息。你现在看到的就是我所拥有的......

我怀疑解决方案非常简单 - 补丁和快速解释可能会受到赞赏!

1 个答案:

答案 0 :(得分:0)

您应该注意文件parson.h中的函数声明和注释。如果某些事情不明确,您还可以查看文件parson.c并执行。

您的函数接收指向JSON_Value的指针,但您尝试将此指针传递给接受JSON_Object指针的函数。那些类型是不同的。仅仅将一个投射到另一个是不够的。

如果您确定知道提供的JSON_Value包含对象,则可以使用json_value_get_object(root_value);获取该对象。但是,如果JSON_Value不是对象(例如数组或字符串),则此函数返回NULL。因此,如果这种情况可能需要进行适当的处​​理。

所需功能:

void setNameValuePair(JSON_Value *rootValue, const char *name, const char *value)
{
    /* NULL is returned if rootValue is not an object */
    JSON_Object *root_object = json_value_get_object(root_value);
    json_object_set_string(root_object, name, value);
}

const char* getValueFromName(const JSON_Value *rootValue, const char *name) 
{
    /* NULL is returned if rootValue is not an object */
    JSON_Object *root_object = json_value_get_object(root_value);

    /* NULL is returned if object field is not a string*/
    return json_object_dotget_string(root_object, name);
}

您应该小心内存分配和内存泄漏。例如,函数json_object_dotget_string不返回字符串的副本,但它返回指向用于创建该JSON的相同字符串的指针。因此,如果释放了初始字符串,则getValueFromName返回的字符串也将被释放。