jsoncpp如何检查tag是否为null .isNull()抛出断言

use*_*898 10 c++ assertions jsoncpp

我使用jsoncpp,它很棒,但当我需要检查json结构是否包含标签时,我这样做:

UserRoot0["error"].isNull()
Run Code Online (Sandbox Code Playgroud)

它从json_value.cpp第1025行抛出断言

JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );
Run Code Online (Sandbox Code Playgroud)

我想检查我得到的响应是否来自这种类型:

{
    "error" : {
        "message" : "Error validating application.",
        "type" : "OAuthException",
        "code" : 190
    }
}
Run Code Online (Sandbox Code Playgroud)

Enn*_*ael 16

[]操作仅适用于JsonValue那些类型的对象Object或为空.所有其他(Int,Bool,Array等)将断言.

如果您的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
Run Code Online (Sandbox Code Playgroud)

isMember()检查也将断言用于非Object节点,所以一定要检查isObject()前检查isMember(),如果UserRoot0是不保证的Object.