10

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

UserRoot0["error"].isNull()

它让我从 json_value.cpp 第 1025 行断言

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

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

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

2 回答 2

16

[]运算符仅对type或 null的JsonValue对象有效。Object所有其他 ( Int, Bool, Array, 等) 将断言。

如果您的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.

于 2012-03-21T18:04:38.757 回答
2

我也偶然发现了这一点。正如 Ennael 所说,您需要确保处理的是对象类型。FWIW我的问题是由使用这样的JSON引起的:

    "error" : {
        "code" : 190
    }

...而不是我的意图:

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

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

于 2012-06-19T19:33:28.347 回答