2012-03-10 41 views
10

進出口使用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的對象有效或爲空。所有其他人(Int,BoolArray等)將會斷言。

如果您UserRoot0對象是Array或其他一些非Object類型,你有更多的工作要做(比如迭代到子節點)的發現可能會或可能不包含錯誤的目標節點。打印UserRoot0.toStyledString()以查看您的JSON的外觀,並確保它看起來像一個JSON對象(請參閱json.org瞭解它是什麼)。

json_value.cpp源文件(其中JSON_ASSERT已定義)的頂部有一個「ToDo」註釋,意味着開發人員可能會在未來版本中計劃更強大的錯誤處理而不是這些斷言,但與此同時,您可以檢查自己,是這樣的:

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節點,所以一定要檢查isMember()如果UserRoot0不能保證是一個Object前檢查isObject()

2

我也偶然發現了這一點。正如Ennael所說,你需要確保你正在處理一個對象類型。 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 2015-02-16 17:46:28

相關問題