我使用jsoncpp,它很棒,但是当我需要检查json结构是否包含标签时 当我这样做时:
UserRoot0["error"].isNull()
它从json_value.cpp第1025行抛出了断言
JSON_ASSERT( type_ == nullValue || type_ == objectValue );
我想检查我的回复是否来自这种类型:
{
"error" : {
"message" : "Error validating application.",
"type" : "OAuthException",
"code" : 190
}
}
答案 0 :(得分:16)
[]
运算符仅对类型为JsonValue
或null的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
。
答案 1 :(得分:2)
我也偶然发现了这一点。正如Ennael所说,你需要确保你正在处理一个对象类型。 FWIW我的问题是由于使用JSON造成的:
"error" : {
"code" : 190
}
...而不是我的意图:
{
"error" : {
"code" : 190
}
}
排除外部括号组将导致值类型变为字符串而不是对象。