无法区分JSONObject/Array/String
Unable to distinguish between JSON Object/Array/String
我正在尝试使用 Jansson 库来解析 JSON 字符串。我无法正确解析它。这是我的 C++ 代码
std::string JSONString = "{\"Hostages\": [{\"Rescue\": \"help me!\",\"confidence\": 0.01}]}";
json_t *JsonTable, *Rescue, *Hostages;
json_error_t JsonError;
if (JSONString.c_str()) {
JsonTable = json_loads(JSONString.c_str(), 0, &JsonError);
if (!JsonTable) {
printf("JSON parsing error: on line %d: %s\n", JsonError.line,
JsonError.text);
}
if (!json_is_object(JsonTable)) {
printf("JSON Pased root is not an array : Invalid response received\n");
json_decref(JsonTable);
}
Hostages = json_object_get(JsonTable, "Hostages");
if (!json_is_array(Hostages)) {
printf("error: Hostages is not array\n");
json_decref(JsonTable);
return 1;
} else {
Hostages = json_array_get(Hostages, json_array_size(Hostages));
Rescue = json_object_get(Hostages,"Rescue");
if (!json_is_string(Rescue)) {
printf("error: Rescue is not string\n");
json_decref(JsonTable);
return 1;
} else {
}
}
}
不明白Rescue
是字符串、对象还是数组。我尝试了所有三个选项 if (!json_is_string(Rescue))
、if (!json_is_array(Rescue))
和 if (!json_is_object(Rescue))
,但它总是打印 "error: Rescue is not string".
请帮忙
?
您正在尝试访问数组的错误元素。
以包含 3 个元素的数组 A = [{},{},{}];
为例,该数组的大小为 3
,因此您可以访问 0
、1
、2
仅。
在您的 post 中,您正在以 Hostages = json_array_get(Hostages, json_array_size(Hostages));
的身份访问 A[sizeof(A)]
您可以 运行 对其进行循环以访问数组的所有元素,在您的情况下只有一个。所以您可以通过 Hostages = json_array_get(Hostages, 0);
访问它
Hostages
是一个(一个)对象数组,每个对象包含一个字符串和一个实数。
在尝试从对象中取出字符串之前,您需要先从数组中取出对象:
// C++17 raw string literal, just to nicely format the json string
std::string JSONString = R"EOF(
{
"Hostages": [
{
"Rescue": "help me!",
"confidence": 0.01
}
]
}
)EOF";
json_t* JsonTable = json_loads(JSONString.c_str(), 0, &JsonError);
assert(json_is_object(JsonTable));
json_t* Hostages = json_object_get(JsonTable, "Hostages");
assert(json_is_array(Hostages));
for (int i = 0; i < json_array_size(Hostages); ++i) {
json_t* Hostage = json_array_get(Hostages, i);
assert(json_is_object(Hostage));
json_t* Rescue = json_object_get(Hostage, "Rescue");
assert(json_is_string(Rescue));
// ...
}
您需要将所有这些 assert
替换为您的 error-handling 代码。我添加它们纯粹是为了说明在您的示例中哪些条件应该成立。
我正在尝试使用 Jansson 库来解析 JSON 字符串。我无法正确解析它。这是我的 C++ 代码
std::string JSONString = "{\"Hostages\": [{\"Rescue\": \"help me!\",\"confidence\": 0.01}]}";
json_t *JsonTable, *Rescue, *Hostages;
json_error_t JsonError;
if (JSONString.c_str()) {
JsonTable = json_loads(JSONString.c_str(), 0, &JsonError);
if (!JsonTable) {
printf("JSON parsing error: on line %d: %s\n", JsonError.line,
JsonError.text);
}
if (!json_is_object(JsonTable)) {
printf("JSON Pased root is not an array : Invalid response received\n");
json_decref(JsonTable);
}
Hostages = json_object_get(JsonTable, "Hostages");
if (!json_is_array(Hostages)) {
printf("error: Hostages is not array\n");
json_decref(JsonTable);
return 1;
} else {
Hostages = json_array_get(Hostages, json_array_size(Hostages));
Rescue = json_object_get(Hostages,"Rescue");
if (!json_is_string(Rescue)) {
printf("error: Rescue is not string\n");
json_decref(JsonTable);
return 1;
} else {
}
}
}
不明白Rescue
是字符串、对象还是数组。我尝试了所有三个选项 if (!json_is_string(Rescue))
、if (!json_is_array(Rescue))
和 if (!json_is_object(Rescue))
,但它总是打印 "error: Rescue is not string".
请帮忙 ?
您正在尝试访问数组的错误元素。
以包含 3 个元素的数组 A = [{},{},{}];
为例,该数组的大小为 3
,因此您可以访问 0
、1
、2
仅。
在您的 post 中,您正在以 Hostages = json_array_get(Hostages, json_array_size(Hostages));
A[sizeof(A)]
您可以 运行 对其进行循环以访问数组的所有元素,在您的情况下只有一个。所以您可以通过 Hostages = json_array_get(Hostages, 0);
Hostages
是一个(一个)对象数组,每个对象包含一个字符串和一个实数。
在尝试从对象中取出字符串之前,您需要先从数组中取出对象:
// C++17 raw string literal, just to nicely format the json string
std::string JSONString = R"EOF(
{
"Hostages": [
{
"Rescue": "help me!",
"confidence": 0.01
}
]
}
)EOF";
json_t* JsonTable = json_loads(JSONString.c_str(), 0, &JsonError);
assert(json_is_object(JsonTable));
json_t* Hostages = json_object_get(JsonTable, "Hostages");
assert(json_is_array(Hostages));
for (int i = 0; i < json_array_size(Hostages); ++i) {
json_t* Hostage = json_array_get(Hostages, i);
assert(json_is_object(Hostage));
json_t* Rescue = json_object_get(Hostage, "Rescue");
assert(json_is_string(Rescue));
// ...
}
您需要将所有这些 assert
替换为您的 error-handling 代码。我添加它们纯粹是为了说明在您的示例中哪些条件应该成立。