2012-03-10 11 views
10

Im usando jsoncpp, la sua grande ma quando ho bisogno di verificare se la struttura JSON contiene tag quando lo faccio con:jsoncpp come verificare se tag è nullo .isNull() un tiro affermazione

UserRoot0["error"].isNull() 

sua tiri mi affermo dalla linea json_value.cpp 1025

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

voglio verificare se la risposta im ricevendo è da questo tipo:

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

risposta

16

L'operatore [] è valido solo per gli oggetti JsonValue di tipo Object o null. Tutti gli altri (Int, Bool, Array, ecc.) Affermeranno.

Se l'oggetto è un UserRoot0Array o qualche altro tipo non Object, avete un po 'di lavoro da fare (come l'iterazione in sotto-nodi) per trovare il tuo nodo di destinazione che possono o non possono contenere l'errore. Stampa UserRoot0.toStyledString() per vedere come è il tuo JSON e assicurati che assomigli ad un oggetto JSON (vedi json.org per una buona panoramica di cosa sia).

Un commento "ToDo" nella parte superiore del file di origine json_value.cpp (dove è definito JSON_ASSERT) implica che gli sviluppatori potrebbero pianificare una gestione degli errori più affidabile invece di queste asserzioni nelle versioni future, ma nel frattempo, si può controllare voi stessi, in questo modo:

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

Il controllo isMember() anche affermare per i non Object nodi, in modo da essere sicuri di controllare isObject() prima di verificare se isMember()UserRoot0 non è garantito per essere un Object.

2

Sono inciampato anche su questo. Come dice Ennael, devi assicurarti di avere a che fare con un tipo di oggetto. FWIW il mio problema è stato causato da utilizzare JSON come questo:

"error" : { 
     "code" : 190 
    } 

... invece di ciò che intendevo:

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

Escludendo l'insieme esterno di parentesi farà sì che il tipo di valore di diventare stringa invece di oggetto.

+0

C'è una nuova impostazione, ['failIfExtra'] (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_char_reader_builder.html#ac69b7911ad64c171c51ebaf2ea26d958), che catturerà questo errore comune. Fa anche parte di 'strictMode()'. – cdunn2001

Problemi correlati