我不确定这是否是jsoncpp的特定内容,或者是如何使C ++库表现得更好的一般范例。基本上我得到了这个痕迹:
imagegeneratormanager.tsk: src/lib_json/json_value.cpp:1176: const Json::Value& Json::Value::operator[](const char*) const: Assertion `type_ == nullValue || type_ == objectValue' failed.
当输入错误时会发生这种情况。当输入 - 来自我的另一个应用程序通过memcached - 碰巧是坏的,我想处理这个错误。你知道,优雅。也许类似于“错误:项目15006的输入是坏的”进入日志。不会崩溃我的整个JSON字符串处理任务。
这只是一个写得不好的库还是可以更巧妙地配置它?
编辑:这是一些调用代码:
Json::Value root;
Json::Reader reader;
succeeded = reader.parse(jsonString, root);
if(!succeeded) {
throw std::runtime_error(std::string("Failed to parse JSON for key ") + emailInfoKey.str());
}
std::string userEmail = root.get("userId", "").asString();
std::string bodyFilePath = root.get("bodyFilePath", "").asString();
std::string msgId = root.get("msgId", "").asString();
答案 0 :(得分:4)
根据图书馆参考:
价值与优惠Json :: Value :: operator [](const StaticString& key)
按名称访问对象值,如果不存在,则创建一个null成员。
似乎您试图在非对象上调用operator[]
,例如整数或字符串(get
内部使用operator[]
)。您正在破坏函数前提条件,并且它是您的代码而不是库的错误。您可以使用Json::Value
检查isObject()
是否为对象,然后再使用{{1}}。
答案 1 :(得分:4)
正如我从JsonCpp Sourceforge回购中看到的那样,现在断言是不可捕获的(但是它似乎是在他们的积压中进行抛出断言)。
然后,在调用[]运算符之前,您必须测试输入是否有效。
指向最新版本源代码的链接(我不知道您拥有的版本)。见第1141行: http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp?revision=249&view=markup