2012-03-10 28 views
10

Im sử dụng jsoncpp, nó rất tốt nhưng khi tôi cần phải kiểm tra xem cấu trúc json chứa thẻ khi tôi làm điều đó với:jsoncpp làm thế nào để kiểm tra xem thẻ là null .isNull() ném khẳng định

UserRoot0["error"].isNull() 

nó ném tôi khẳng định từ dòng json_value.cpp 1025

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

tôi muốn kiểm tra xem phản ứng im nhận được là từ loại này:

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

Trả lời

16

Toán tử [] chỉ hợp lệ đối với JsonValue đối tượng thuộc loại Object hoặc null. Tất cả những người khác (Int, Bool, Array, v.v.) sẽ xác nhận.

Nếu đối tượng UserRoot0 của bạn là Array hoặc một số loại khác không phải là (như chuyển vào nút con) để tìm nút đích có thể có hoặc không chứa lỗi. In UserRoot0.toStyledString() để xem JSON của bạn trông như thế nào và chắc chắn rằng nó trông giống như một đối tượng JSON (xem json.org để có cái nhìn tổng quan về cái đó là gì).

Nhận xét "ToDo" ở đầu tệp nguồn json_value.cpp (trong đó JSON_ASSERT được xác định) ngụ ý rằng nhà phát triển có thể đang lập kế hoạch xử lý lỗi mạnh mẽ hơn thay vì các xác nhận này trong các phiên bản sau, nhưng trong thời gian chờ đợi, bạn có thể kiểm tra chính mình, như thế này:

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

vui lòng cung isMember() cũng sẽ khẳng định cho phi Object nút, vì vậy hãy chắc chắn kiểm tra isObject() trước khi kiểm tra isMember() nếu UserRoot0 không được đảm bảo là một Object.

2

Tôi cũng tình cờ gặp điều này. Như Ennael nói rằng bạn cần phải chắc chắn rằng bạn đang đối phó với một loại đối tượng. FWIW vấn đề của tôi đã được gây ra bằng cách sử dụng JSON như thế này:

"error" : { 
     "code" : 190 
    } 

... thay vì những gì tôi dự định:

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

Loại trừ bộ ngoài ngoặc sẽ gây ra các loại giá trị để trở thành chuỗi thay vì vật.

+0

Có cài đặt mới, ['failIfExtra'] (http://open-source-parsers.github.io/jsoncpp-docs/doxygen/class_json_1_1_char_reader_builder.html#ac69b7911ad64c171c51ebaf2ea26d958), lỗi này sẽ gặp lỗi phổ biến này. Nó cũng là một phần của 'strictMode()'. – cdunn2001

Các vấn đề liên quan