通过使用 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<bool>(subTreeIt->second.data());
但这似乎不是首选方式。我敦促你阅读 Docs: How to Access Data in a Property Tree.
但是,我没有看到使用迭代器的另一种方法。所以我想你很好,因为你已经有了它。首选方式似乎取决于您不使用的路径。
为了它的价值...您可能应该使用find
而不是手动迭代,或者为某些版本的get
重构您的代码。这似乎是一个更好的设计。
【讨论】:
这个怎么样?这也有效; if (boost::iequals ( subTreeIt->second.data() , "false")) m_relay = false; 是的,但是为什么?如果用户输入flase
或0
会怎样?
它必须失败,如果它不是真假,它应该失败
你不处理它...... lexical_cast 处理。
如果不是真假,代码是否会失败?以上是关于通过使用 boost 属性树解析 JSON 文件来访问布尔值的主要内容,如果未能解决你的问题,请参考以下文章