我是新来的,尝试实现一个 Json 解析器。 我找到了 Json 解析器程序的教程 ( https://linuxprograms.wordpress.com/2010/05/20/json-c-libjson-tutorial/ )。
所以我有一个像这样的 Json 文件输入:
{ "DefaultTest": "SS",
"Send": {
"ip_hl": 4,
"ip_v": 4,
....
}
}
我使用教程中的代码 ( https://linuxprograms.wordpress.com/2010/08/19/json_parser_json-c/ ) 并尝试理解这一代码。但我收到一个错误,该方法 json_object_object_get_get(jobj, key) 未声明
。
因此,找到一个 Wibesite ( https://json-c.github.io/json-c/json-c-0.10/doc/html/deprecated.html ),其中包含 json-lib 的弃用列表。在此,我应该使用 json_object_object_get_ex
。
如果我使用该方法,我会收到此警告:赋值使指针来自整数而不进行强制转换 [-Wint-conversion] jobj = json_object_object_get_ex(jobj, key, NULL);
这是什么意思?我该如何修复它? 我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <json/json.h>
void json_parse(json_object * jobj) {
enum json_type type;
json_object_object_foreach(jobj, key, val)
{
printf("type: %d\n", type);
type = json_object_get_type(val);
switch (type) {
case json_type_boolean:
case json_type_double:
case json_type_int:
case json_type_string:
// print_json_value(val);
break;
case json_type_object:
printf("json_type_objectn");
// jobj = json_object_object_get(jobj, key);
jobj = json_object_object_get_ex(jobj, key, NULL);
json_parse(jobj);
break;
case json_type_array:
// printf("json_type_arrayn");
// json_parse_array(jobj,key);
break;
}
}
}
int main() {
char *path = "../Paketspezifikationen/Default-File/DefaultConfig2.json";
FILE *fp;
char *data = NULL;
if ((fp = fopen(path, "rb")) == NULL) {
} else if (fseek(fp, 0, SEEK_END) != 0) {
fclose(fp);
} else {
long size = ftell(fp);
if (size > 0 && (data = (char *) malloc(size + 1)) != NULL) {
fseek(fp, 0, SEEK_SET);
if (fread(data, 1, size, fp) != (size_t) size) {
free(data);
data = NULL;
} else {
data[size] = '\0';
}
}
fclose(fp);
}
printf("JSON string: %sn", data); // return data
json_object * jobj = json_tokener_parse(data);
json_parse(jobj);
}
在 Main 中,我首先读取 Json 文件并将其存储在字符串中,然后尝试从那里获取所有键和值。所以我使用 json 解析器。
希望你能帮助我。
最佳答案
json_object_object_get_ex()
函数返回一个 json_bool
(实际上是一个 int
),指示是否在父 JSON 中找到给定的键对象,因此您不能将函数返回值分配给 jobj
,它是一个指针:这就是警告的来源。
由于在您的代码中您已经有一个指向与给定键对应的 JSON 对象的指针(在 val
变量中),因此您可以通过避免调用 来更简单地实现您想要的目标>json_object_object_get_ex()
并调用 json_parse(val)
。
关于c - 带有 json-c 库的 C 语言 JsonParser | json_object_object_get(...) 未声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53374815/