jsoncpp, как проверить, является ли тег нулевым .isNull () бросить утверждение - PullRequest
10 голосов
/ 10 марта 2012

Я использую jsoncpp, это здорово, но когда мне нужно проверить, содержит ли структура json тег, когда я делаю это с:*

Я хочу проверить, получен ли им ответ этого типа:

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

Ответы [ 2 ]

16 голосов
/ 21 марта 2012

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

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

A "Комментарий 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 голосов
/ 19 июня 2012

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

    "error" : {
        "code" : 190
    }

... вместо того, что я намеревался:

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

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

...