通过使用boost属性树解析JSON文件来访问布尔值

时间:2017-05-24 13:15:34

标签: c++ json c++11 boost-propertytree boost-iterators

以下是从JSON文件中获取值所遵循的步骤:

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

我无法获取布尔值。

在下面的代码中,我是:

  1. 打开JSON文件
  2. 设置根元素并开始遍历此根元素下的子树(Bases)
  3. 获取每个标记的值并将其保存到适当的变量类型。
  4. 代码:

    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&gt ;,std :: allocator< char> >在分配中''到'bool'

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

    如果我改变

    bool m_relay;
    

    std::string m_relay;
    

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

    我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

你必须手动投射:

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

但它似乎不是一种首选方式。我劝你读 Docs: How to Access Data in a Property Tree

但是,我没有看到使用迭代器的另一种方法。鉴于你已经拥有它,我猜你没事。首选方式似乎取决于您不使用的路径。

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

答案 1 :(得分:0)

尝试使用:

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

而不是:

m_relay = boost::algorithm::trim_copy(subTreeIt->second.data());