2012-03-10 13 views
10

Im usando jsoncpp, su gran pero cuando yo necesita comprobar si la estructura JSON contiene la etiqueta cuando lo hago con:jsoncpp cómo comprobar si la etiqueta es la afirmación nula .isNull de proyección()

UserRoot0["error"].isNull() 

su tiros me afirmo desde la línea json_value.cpp 1025

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

Quiero comprobar si la respuesta es im conseguir de este tipo:

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

Respuesta

16

El operador [] solo es válido para objetos JsonValue que son de tipo Object o nulo. Todos los demás (Int, Bool, Array, etc.) afirmarán.

Si el objeto es un UserRoot0Array o algún otro tipo no Object, usted tiene más trabajo que hacer (como la iteración en sub-nodos) para encontrar su nodo de destino que pueden o no pueden contener el error. Imprima UserRoot0.toStyledString() para ver cómo se ve su JSON, y asegúrese de que se ve como un Objeto JSON (consulte json.org para obtener una descripción general de lo que es).

Un comentario "ToDo" en la parte superior del archivo fuente json_value.cpp (donde JSON_ASSERT está definido) implica que los desarrolladores pueden estar planeando un manejo de errores más robusto en lugar de estos asertos en versiones futuras, pero mientras tanto, puede comprobar usted mismo, de esta manera:

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

El cheque isMember() también afirmará para Object nodos no, así que asegúrese de comprobar isObject() antes de comprobar si isMember()UserRoot0 no se garantiza que sea un Object.

2

Me tropecé con esto también. Como Ennael dice que necesita asegurarse de que está tratando con un tipo de objeto. Fwiw mi problema fue causado por el uso de JSON como esto:

"error" : { 
     "code" : 190 
    } 

... en lugar de lo que pretendía:

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

Excluyendo el conjunto exterior de paréntesis hará que el tipo de valor para convertirse en cadena en lugar de objeto.

+0

Hay una nueva configuración, ['failIfExtra'] (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_char_reader_builder.html#ac69b7911ad64c171c51ebaf2ea26d958), que detectará este error común. También es parte de 'strictMode()'. – cdunn2001

Cuestiones relacionadas