我正在尝试使用boost属性树创建一个JSON数组.
该文件说:"JSON数组被映射到节点的每个元素与空名称的子节点."
所以我想创建一个空名称的属性树,然后调用write_json(...)以获取数组.但是,文档没有告诉我如何创建未命名的子节点.我试过了ptree.add_child("", value),但这会产生:
Assertion `!p.empty() && "Empty path not allowed for put_child."' failed
Run Code Online (Sandbox Code Playgroud)
文档似乎没有解决这一点,至少不能以任何方式解决.有人可以帮忙吗?
我是新手std::Map.什么是boost使用类型序列化和反序列化数据的最简单方法PropertyTree.我发现了一些使用的例子,std::Map但对我来说它们很模糊.
我想使用boost属性树write_json序列化,这样可以节省一切为字符串,这并不是说数据是错误的,但我需要每次都明确地投下他们,我想别的地方使用它们.(比如在python或其他C++ json(非boost)库中)
这里是一些示例代码以及我根据区域设置得到的内容:
boost::property_tree::ptree root, arr, elem1, elem2;
elem1.put<int>("key0", 0);
elem1.put<bool>("key1", true);
elem2.put<float>("key2", 2.2f);
elem2.put<double>("key3", 3.3);
arr.push_back( std::make_pair("", elem1) );
arr.push_back( std::make_pair("", elem2) );
root.put_child("path1.path2", arr);
std::stringstream ss;
write_json(ss, root);
std::string my_string_to_send_somewhare_else = ss.str();
Run Code Online (Sandbox Code Playgroud)
并且my_string_to_send_somewhere_else是某事.像这样:
{
"path1" :
{
"path2" :
[
{
"key0" : "0",
"key1" : "true"
},
{
"key2" : "2.2",
"key3" : "3.3"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
反正是将它们保存为值,例如:
"key1" : true或"key2" : 2.2?
我正在尝试编写XML解析器,将XML文件解析为a boost::property_tree并解决了这个问题.如何(快速)检查某个房产的孩子是否存在?
显然我可以迭代所有使用的孩子BOOST_FOREACH- 但是,这不是更好的解决方案吗?
我正在使用boost :: property_tree在我的应用程序中读取和写入XML配置文件.但是当我写文件时,输出看起来很丑陋,文件中有很多空行.问题是它应该由人类编辑,所以我想获得更好的输出.
作为一个例子,我写了一个小测试程序:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
int main( void )
{
using boost::property_tree::ptree;
ptree pt;
// reading file.xml
read_xml("file.xml", pt);
// writing the unchanged ptree in file2.xml
boost::property_tree::xml_writer_settings<char> settings('\t', 1);
write_xml("file2.xml", pt, std::locale(), settings);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
file.xml包含:
<?xml version="1.0" ?>
<config>
<net>
<listenPort>10420</listenPort>
</net>
</config>
Run Code Online (Sandbox Code Playgroud)
运行程序后,file2.xml包含:
<?xml version="1.0" encoding="utf-8"?>
<config>
<net>
<listenPort>10420</listenPort>
</net>
</config>
Run Code Online (Sandbox Code Playgroud)
有没有办法获得更好的输出,除了手动通过输出和删除空行?
首先,我要说我认为我应该怎么做但我的代码不会以任何方式编译我尝试.我的假设基于这个空ptree技巧的官方例子.在那里你可以找到下一行:
const ptree &settings = pt.get_child("settings", empty_ptree<ptree>());
Run Code Online (Sandbox Code Playgroud)
这表明从(或应该)可以从ptree中获取subptree.
所以我假设我们可以用BOOST_FOREACH这样的方式迭代到ptree :
BOOST_FOREACH(const boost::property_tree::ptree &v,
config.get_child("servecies"))
{
}
Run Code Online (Sandbox Code Playgroud)
但我得到下一个错误:
错误1错误C2440:'初始化':无法从'std :: pair <_Ty1,_Ty2>'转换为'const boost :: property_tree :: ptree&'
或者如果我尝试
BOOST_FOREACH(boost::property_tree::ptree &v,
config.get_child("servecies", boost::property_tree::empty_ptree<boost::property_tree::ptree>()))
{
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
错误1错误C2039:'empty_ptree':不是'boost :: property_tree'的成员
那我该怎么做:如何通过Boost Ptree迭代并得到子Ptrees?
更新: 我也试过这样的代码
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("path.to.array_of_objects"))
{
std::cout << "First data: " << v.first.data() << std::endl;
boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
subtree)
{
std::cout << "Sub data: " << vs.first.data() << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
这编译,不会抛出任何exeptions但不会cout任何 …
我有一些带有一些整数数组变量的JSON,如下所示:
{"a": [8, 6, 2], "b": [2, 2, 1]}
Run Code Online (Sandbox Code Playgroud)
我想使用boost property_tree,例如:
std::stringstream ss;
boost::property_tree::ptree pt;
ss << "{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}";
boost::property_tree::read_json(ss, pt);
std::vector<int> a = pt.get<std::vector<int> >("a");
Run Code Online (Sandbox Code Playgroud)
这不起作用,我尝试过的int指针也没有任何变化.我如何从属性树中读取数组?
说我有这种XML格式:
<Widget type="SomeWidget" name="foo">
<Event name="onmouseover">
dostuff();
</Event>
</Widget>
Run Code Online (Sandbox Code Playgroud)
如何使用Boost.PropertyTree读取属性?
我知道正在接近提升属性树,并发现它是c ++编程的boost库的一个很好的特性.
好吧,我有一个疑问?如何使用迭代器或类似方法迭代属性树?
在参考中,只有一个浏览树的例子:
BOOST_FOREACH
Run Code Online (Sandbox Code Playgroud)
但仅此而已吗?像stl一样的容器?谈到代码质量,这将是一个更好的解决方案....
我正在寻找一个行为类似于boost::property_tree但(可选)将每个值项的get/set实现留给开发人员的数据结构.
你应该可以做这样的事情:
std::function<int(void)> f_foo = ...;
my_property_tree tree;
tree.register<int>("some.path.to.key", f_foo);
auto v1 = tree.get<int>("some.path.to.key"); // <-- calls f_foo
auto v2 = tree.get<int>("some.other.path"); // <-- some fallback or throws exception
Run Code Online (Sandbox Code Playgroud)
我想你可能会滥用property_tree这个但是我还没有考虑过实现,除非我知道这是一个预期的用例,否则我会对此感到不好.
编写一个处理请求的类,例如val = tree.get("some.path.to.key")通过调用提供的函数,首先看起来并不太难,但我可以想象很多特殊情况会使这个庞大的库变得庞大.
一些额外的功能可能是:
子树处理:不仅处理终端密钥,而且将某些子树转发给单独的实现.例如
tree.register("some.path.config", some_handler);
// calls some_handler.get<int>("network.hostname")
v = tree.get<int>("some.path.config.network.hostname");
Run Code Online (Sandbox Code Playgroud)在值/键之间搜索
boost::property_tree)是否有一个接近我正在寻找的图书馆?有没有人boost::property_tree为此目的使用经验?(通过继承或将特殊对象到树像例如描述这里)