0

我正在尝试使用 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是字符串、对象还是数组。我尝试了所有三个选项 as if (!json_is_string(Rescue)),但它总是打印if (!json_is_array(Rescue))" error: Rescue is not string"if (!json_is_object(Rescue))

请问有什么帮助吗?

4

2 回答 2

1

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));

    // ...
}

您需要将所有这些asserts 替换为您的错误处理代码。我添加它们纯粹是为了说明在您的示例中哪些条件应该成立。

于 2019-06-12T10:26:58.347 回答
1

您正在尝试访问不正确的数组元素。

以一个包含 3 个元素的数组为例A = [{},{},{}];,这个数组的大小是这样的3,所以你可以访问的地方只有0, 1, 2

在您的帖子中,您A[sizeof(A)]Hostages = json_array_get(Hostages, json_array_size(Hostages));

您可以在它上面运行一个循环来访问数组的所有元素,在您的情况下只有一个。所以你可以访问它Hostages = json_array_get(Hostages, 0);

于 2019-06-12T10:25:31.317 回答