【问题标题】:How to make jsoncpp throw in this case?在这种情况下如何让 jsoncpp 抛出?
【发布时间】:2017-07-11 19:08:08
【问题描述】:

我在 ubuntu 14.04 上使用 jsoncpp。与 apt-get libjsoncpp-dev libjsoncpp0 一起安装。我不确定它是什么版本的 jsoncpp。

我的键名有错字(在 C++ 中),很难追查。考虑这个例子:

#include <iostream>
#include <jsoncpp/json/json.h>

int main(int argc, char** argv) {
  Json::Reader reader(Json::Features::strictMode());
  Json::Value obj;

  std::string json = "{\"mykey\" : 42}";

  if (!reader.parse(json.c_str(), obj)) {
    std::cout << "JSON parse error" << std::endl;
  }
  const Json::Value& mykey1 = obj["mykey"];
  std::cout << "mykey1:" << mykey1.asInt() << std::endl;

  const Json::Value& mykey2 = obj["mykey_typo"];
  std::cout << "mykey2:" << mykey2.asInt() << std::endl;
  return 0;
}

我得到这个输出:

mykey1:42
mykey2:0

访问不存在的密钥会产生 0 值这一事实让我感到害怕。这意味着如果有错字,程序将只使用零而不是正确的值。我宁愿知道有错字。有没有办法让 jsoncpp 抛出或者这里推荐的方法是什么?

我可以编写一个调用 isMember 然后进行查找的助手,但我想知道库本身是否有解决方案。

【问题讨论】:

    标签: c++ json jsoncpp


    【解决方案1】:

    当值为空时,jsoncpp asInt 的行为看起来像设计返回 0。也许在使用值之前做一个空检查?

    看看source中的第721行。

    【讨论】:

    • 令我惊讶的是 jsoncpp 会引发解析错误。但它不会引发“访问错误”。你可以请求不存在的键,即使是从一个空对象,也不会出错。并且 null 返回 0 数值并且没有错误。我猜的解决方案就是明确使用 isNull 和 isMember。
    • 看来这可能是 jsoncpp 开发人员试图模仿 std::map 的行为。但是,我不确定访问 JsonValue 对象中不存在的键是否会增加大小。
    • 嗯,是的,我很想制作一个会抛出的包装器对象,但后来我想知道我是否在上游游泳并且应该接受图书馆的方法,没有任何东西抛出。无论如何,这不是一个错误:root["bogus1"]["bogus2"]["bogus3"].asInt() 只返回 0。
    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多