2012-03-10 9 views
10

Im przy jsoncpp, jego wielkie, ale kiedy trzeba sprawdzić, czy struktura json zawiera znacznik kiedy zrobić to z:jsoncpp jak sprawdzić, czy tag jest null .isNull() rzut twierdzenie

UserRoot0["error"].isNull() 

jego rzuty mnie dochodzić od linii json_value.cpp 1025

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

chcę sprawdzić, czy odpowiedź jest im uzyskanie z tego typu:

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

Odpowiedz

16

Operator [] jest ważny tylko dla obiektów JsonValue, które są typu Object lub zerowego. Wszystkie inne (Int, Bool, Array itd.) Będą twierdzić.

Jeśli obiekt UserRoot0 jest Array lub jakiś inny rodzaj nie- Object, masz jeszcze trochę do zrobienia (jak iteracji do podrzędnych węzłów), aby znaleźć swój węzeł docelowy, który może lub nie może zawierać błąd. Wydrukuj UserRoot0.toStyledString(), aby zobaczyć, jak wygląda twój JSON, i upewnij się, że wygląda jak Obiekt JSON (zobacz json.org, aby uzyskać ładny przegląd tego, co to jest).

Komentarz do "ToDo" u góry pliku źródłowego json_value.cpp (gdzie zdefiniowano JSON_ASSERT) sugeruje, że programiści mogą planować bardziej niezawodną obsługę błędów zamiast tych twierdzeń w przyszłych wersjach, ale w międzyczasie można sprawdzić samemu, jak to:

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

kontrola isMember() będą również dochodzić do nie- Object węzłów, więc należy sprawdzić isObject() przed sprawdzeniem isMember() jeśli UserRoot0 nie jest gwarantowana być Object.

2

Natknąłem się na to też. Jak mówi Ennael, musisz upewnić się, że masz do czynienia z typem obiektu. FWIW mój problem został spowodowany za pomocą JSON tak:

"error" : { 
     "code" : 190 
    } 

... zamiast tego, co zamierzałem:

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

Bez zewnętrznego zestawu nawiasie spowoduje typ wartości, aby stać ciąg zamiast obiekt.

+0

Istnieje nowe ustawienie, ['failIfExtra'] (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_char_reader_builder.html#ac69b7911ad64c171c51ebaf2ea26d958), które wykryje ten typowy błąd. Jest także częścią 'strictMode()'. – cdunn2001