Невозможно различить JSON Object / Array / String - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь использовать библиотеку 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 is not string" .

Любая помощь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

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 на код обработки ошибок. Я добавил их просто, чтобы показать, какие условия должны выполняться на вашем примере.

1 голос
/ 12 июня 2019

Вы пытаетесь получить доступ к неправильному элементу массива.

Возьмите, например, массив A = [{},{},{}]; из 3 элементов, размер этого массива равен 3, поэтому вы можете получить доступ к местам как *Только 1005 *, 1, 2.

в своем сообщении вы обращаетесь к A[sizeof(A)] как Hostages = json_array_get(Hostages, json_array_size(Hostages));

Вы можете запустить цикл над ним, чтобы получить доступ ко всем элементамваш массив, в вашем случае только один.так что вы можете получить к нему доступ как Hostages = json_array_get(Hostages, 0);

...