以下是从JSON文件中获取值所遵循的步骤:
{
"Bases":[
{
"mnemonic":"ADIS.LA.01",
"relay":true
},
{
"mnemonic":"ALEX.LA.01",
"relay":true
}
]
}
我无法获取布尔值。
在下面的代码中,我是:
代码:
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
类型无法编译。
我错过了什么吗?
答案 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());