1

以下是我从 JSON 文件中获取值的步骤:

{
  "Bases":[
    {
      "mnemonic":"ADIS.LA.01",
      "relay":true
    },
    {
      "mnemonic":"ALEX.LA.01",
      "relay":true
    }
  ]
}

我无法获取布尔值。

在下面的代码中,我是:

  1. 打开 JSON 文件
  2. 设置根元素并开始遍历该根元素下的子树(Bases)
  3. 获取每个标签的值并将它们保存到适当的变量类型。

代码:

ReadJsonFile()
{
    using boost::property_tree::ptree;
    const boost::property_tree::ptree& propTree
    boost::property_tree::read_json(ss, pt);
    const std::string rootElement = "Bases"; 
    boost::property_tree::ptree childTree;
    bool m_relay;
    try
    {
        /** get_child - Get the child at the given path, or throw @c ptree_bad_path. */
        childTree = propTree.get_child(rootElement);
    }
    catch (boost::property_tree::ptree_bad_path& ex)
    {
        return false;
    }

    BOOST_FOREACH(const boost::property_tree::ptree::value_type &v, propTree.get_child(rootElement)){
       string vID;
       for (ptree::const_iterator subTreeIt = v.second.begin(); subTreeIt != v.second.end(); ++subTreeIt) {
          if (subTreeIt->first == "mnemonic")
          {
             // Get the value string and trim the extra spaces, if any
             vID = boost::algorithm::trim_copy( subTreeIt->second.data() );
          }
          if (subTreeIt->first == "relay")
          {
            m_relay = boost::algorithm::trim_copy(subTreeIt->second.data());
          }
       }
    }
 }

错误:

错误:无法在赋值中将 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' 转换为 'bool'

显然,布尔值"relay":true被视为字符串而不是bool.

如果我改变

bool m_relay;

std::string m_relay;

代码工作正常,但bool类型无法编译。

我错过了什么吗?

4

2 回答 2

1

尝试使用这个:

m_relay = subTreeIt->second.get_value<bool>();

而不是这个:

m_relay = boost::algorithm::trim_copy(subTreeIt->second.data());
于 2017-05-24T17:58:07.973 回答
0

您必须手动投射它:

boost::lexical_cast<bool>(subTreeIt->second.data());

但这似乎不是首选方式。我敦促您阅读 文档:如何访问属性树中的数据

但是,我没有看到使用迭代器的另一种方式。所以我想你很好,因为你已经有了它。首选方式似乎取决于您不使用的路径。

对于它的价值......您可能应该使用find而不是手动迭代,或者为某些版本的get. 这似乎是一个更好的设计。

于 2017-05-24T13:31:43.323 回答