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

时间:2012-03-10 14:53:20

标签: c++ assertions jsoncpp

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

UserRoot0["error"].isNull()

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

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

我想检查我的回复是否来自这种类型:

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

2 个答案:

答案 0 :(得分:16)

[]运算符仅对类型为JsonValue或null的Object个对象有效。所有其他人(IntBoolArray等)都会断言。

如果您的UserRoot0对象是Array或其他非Object类型,您还有一些工作要做(比如迭代到子节点)以找到您的目标节点可能包含或可能不包含错误。打印UserRoot0.toStyledString()以查看您的JSON的外观,并确保它看起来像一个JSON对象(请参阅json.org以获得对该内容的详细概述)。

json_value.cpp源文件顶部的“ToDo”注释(其中定义了JSON_ASSERT)意味着开发人员可能正在计划更强大的错误处理,而不是在将来的版本中使用这些断言,但是与此同时,你可以检查自己,如下:

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个节点进行断言,因此请务必先检查isObject(),然后再检查isMember()是否无法保证UserRoot0成为Object

答案 1 :(得分:2)

我也偶然发现了这一点。正如Ennael所说,你需要确保你正在处理一个对象类型。 FWIW我的问题是由于使用JSON造成的:

    "error" : {
        "code" : 190
    }

...而不是我的意图:

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

排除外部括号组将导致值类型变为字符串而不是对象。