这个问题是关于与服务器相关的通信和加密的项目中使用的两个小功能。到目前为止,我仅使用C进行编程,但是由于项目的性质,通过Parson Header File(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);
我认为我无法扩展,解释或包含更多信息。你现在看到的就是我所拥有的...
我怀疑解决方案很简单-补丁和快速解释将不胜感激!
最佳答案
您应该注意文件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
返回的字符串也将被释放。关于c - 将名称/值对写入JSON对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32847528/