2012-03-10 6 views
10

Im используя jsoncpp, его большой, но когда мне нужно проверить, если структура содержит тег JSON , когда я делаю это с:jsoncpp как проверить, если тег пустой .isNull() бросок утверждение

UserRoot0["error"].isNull() 

его бросает я утверждаю от json_value.cpp линии 1025

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

я хочу, чтобы проверить, если ответ им получать от этого типа:

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

ответ

16

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

Если UserRoot0 объекта является Array или каким-либо другой не- Object типа, у вас есть еще немного поработать (как итерацию в подузлы), чтобы найти свой целевой узел, который может или не может содержать ошибку. Распечатайте 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 
    } 
} 

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

+0

Существует новая настройка, [ 'failIfExtra'] (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_char_reader_builder.html#ac69b7911ad64c171c51ebaf2ea26d958), который поймает эту общую ошибку. Он также является частью 'strictMode()'. – cdunn2001

 Смежные вопросы

  • Нет связанных вопросов^_^