6

我不确定这是否是 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();
4

2 回答 2

4

根据图书馆参考:

Value & Json::Value::operator[] ( const StaticString & key )

按名称访问对象值,如果不存在则创建一个空成员。

似乎您正在尝试调用operator[]非对象,例如整数或字符串get内部使用operator[]。您正在破坏函数前提条件,并且它在您的代码而非库中是错误的。您可以Json::Value在使用 访问它之前检查它是否是一个对象isObject()

于 2012-06-01T15:17:10.720 回答
4

正如我从 JsonCpp Sourceforge 存储库中看到的那样,现在断言是不可捕获的(但是似乎在他们的积压中进行抛出断言)。

然后,您必须在调用 [] 运算符之前测试输入是否有效。

最新版本源代码的链接(我不知道你的版本)。见第 1141 行:http: //jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/src/lib_json/json_value.cpp ?revision=249&view=markup

于 2012-06-01T15:24:44.130 回答