Jsoncpp, как проверить, равен ли тег null.isNull() throw assertion

Im, использующий jsoncpp, его большой, но когда мне нужно проверить, содержит ли json-структуру тег когда я делаю это с помощью:

UserRoot0["error"].isNull()

его выдает мне утверждение из строки json_value.cpp 1025

JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );

Я хочу проверить, есть ли ответ im get от этого типа:

{
    "error" : {
        "message" : "Error validating application.",
        "type" : "OAuthException",
        "code" : 190
    }
}

Ответ 1

Оператор [] действителен только для объектов JsonValue, которые имеют тип Object или null. Все остальные (Int, Bool, Array и т.д.) Будут утверждать.

Если ваш объект UserRoot0 - это Array или какой-либо другой тип не Object, у вас есть еще одна работа (например, итерация на узлы), чтобы найти вашу цель node, которая может или может не содержит ошибки. Распечатайте UserRoot0.toStyledString(), чтобы увидеть, как выглядит ваш JSON, и убедитесь, что он похож на объект JSON (см. json.org для приятного обзора что это такое).

Комментарий "ToDo" в начале исходного файла json_value.cpp(где JSON_ASSERT) подразумевает, что разработчики могут планировать более надежную обработку ошибок вместо этих утверждений в будущих версиях, но тем временем, вы можете проверить себя, например:

if(UserRoot0.isObject() && UserRoot0.isMember("error"))
    // Process error node
else
    // This node isn't an Object node or doesn't contain the "error" key

Проверка isMember() также будет указана для узлов не Object, поэтому обязательно проверьте isObject() перед проверкой isMember(), если UserRoot0 не гарантируется как Object.

Ответ 2

Я тоже наткнулся на это. Как говорит Эннаэль, вам нужно убедиться, что вы имеете дело с типом объекта. FWIW моя проблема была вызвана использованием JSON следующим образом:

    "error" : {
        "code" : 190
    }

... вместо того, что я думал:

{
    "error" : {
        "code" : 190
    }
}

Исключение внешнего набора скобок приведет к тому, что тип значения станет строкой вместо объекта.