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

Posted

技术标签:

【中文标题】通过使用 boost 属性树解析 JSON 文件来访问布尔值【英文标题】:Accessing Boolean values by parsing JSON file using boost property tree 【发布时间】:2017-05-24 13:15:34 【问题描述】:

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


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

我无法获取布尔值。

在下面的代码中,我是:

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

代码:

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, std::allocator >’转换为‘bool’

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

如果我改变了

bool m_relay;

std::string m_relay;

代码运行正常,但bool 类型编译失败。

我错过了什么吗?

【问题讨论】:

可能想看看***.com/questions/4597048/… 我调查了一下,它没有提供有关使用 ptree::const_iterator 获取布尔值的信息,因此我问了这个问题 @LearningCpp:实际上,如果您仔细阅读,它确实提供了如何获取不同数据类型的详细信息。尝试使用m_relay = subTreeIt->second.get_value<bool>(); 而不是m_relay = boost::algorithm::trim_copy(subTreeIt->second.data()); 【参考方案1】:

试试这个:

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

而不是这个:

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

【讨论】:

【参考方案2】:

您必须手动投射:

boost::lexical_cast&lt;bool&gt;(subTreeIt-&gt;second.data());

但这似乎不是首选方式。我敦促你阅读 Docs: How to Access Data in a Property Tree.

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

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

【讨论】:

这个怎么样?这也有效; if (boost::iequals ( subTreeIt->second.data() , "false")) m_relay = false; 是的,但是为什么?如果用户输入flase0 会怎样? 它必须失败,如果它不是真假,它应该失败 你不处理它...... lexical_cast 处理。 如果不是真假,代码是否会失败?

以上是关于通过使用 boost 属性树解析 JSON 文件来访问布尔值的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost 属性树遍历 json 属性键和值

使用 boost 属性树解析 XML

Boost属性树xml解析No such node()

使用属性树在 boost 中解析 xml

使用 Boost 属性树解析 SVG (XML)

通过 boost 属性树(递归)发出 YAML 迭代