簡體   English   中英

無法區分JSON對象/數組/字符串

[英]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))但它始終顯示“錯誤:Rescue不是字符串”

有什么幫助嗎?

您正在嘗試訪問該數組的錯誤元素。

例如,數組A = [{},{},{}]; 3個元素,這種陣列的尺寸是3 ,以便可以訪問場所作為012只。

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

您可以在其上運行循環以訪問數組的所有元素,在您的情況下,僅訪問其中的一個。 因此您可以將其作為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 我添加它們純粹是為了說明在您的示例中哪些條件應該成立。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM