标签: boost-propertytree

使用属性树在Boost中创建JSON数组

我正在尝试使用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)

文档似乎没有解决这一点,至少不能以任何方式解决.有人可以帮忙吗?

c++ json boost boost-propertytree

66
推荐指数
4
解决办法
6万
查看次数

使用boost序列化和反序列化json

我是新手std::Map.什么是boost使用类型序列化和反序列化数据的最简单方法PropertyTree.我发现了一些使用的例子,std::Map但对我来说它们很模糊.

c++ json boost boost-propertytree

66
推荐指数
2
解决办法
6万
查看次数

为什么提升属性树write_json将所有内容保存为字符串?有可能改变吗?

我想使用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

json boost boost-propertytree

61
推荐指数
4
解决办法
3万
查看次数

Boost PropertyTree:检查孩子是否存在

我正在尝试编写XML解析器,将XML文件解析为a boost::property_tree并解决了这个问题.如何(快速)检查某个房产的孩子是否存在?

显然我可以迭代所有使用的孩子BOOST_FOREACH- 但是,这不是更好的解决方案吗?

c++ boost boost-propertytree

36
推荐指数
3
解决办法
4万
查看次数

boost :: property_tree XML漂亮打印

我正在使用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)

有没有办法获得更好的输出,除了手动通过输出和删除空行?

c++ boost boost-propertytree

31
推荐指数
1
解决办法
2万
查看次数

Boost 1.46.1,属性树:如何迭代ptree接收子ptree?

首先,我要说我认为我应该怎么做但我的代码不会以任何方式编译我尝试.我的假设基于这个空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任何 …

c++ boost subtree boost-propertytree boost-foreach

30
推荐指数
3
解决办法
5万
查看次数

使用boost属性树来读取int数组

我有一些带有一些整数数组变量的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指针也没有任何变化.我如何从属性树中读取数组?

c++ json boost boost-propertytree

28
推荐指数
2
解决办法
2万
查看次数

如何在Boost.PropertyTree中解析属性?

说我有这种XML格式:

<Widget type="SomeWidget" name="foo">
   <Event name="onmouseover">
      dostuff();
   </Event>
</Widget>
Run Code Online (Sandbox Code Playgroud)

如何使用Boost.PropertyTree读取属性?

c++ boost boost-propertytree

20
推荐指数
2
解决办法
2万
查看次数

如何迭代boost属性树?

我知道正在接近提升属性树,并发现它是c ++编程的boost库的一个很好的特性.

好吧,我有一个疑问?如何使用迭代器或类似方法迭代属性树?

在参考中,只有一个浏览树的例子:

BOOST_FOREACH
Run Code Online (Sandbox Code Playgroud)

但仅此而已吗?像stl一样的容器?谈到代码质量,这将是一个更好的解决方案....

c++ xml iterator boost-propertytree

19
推荐指数
3
解决办法
3万
查看次数

具有通用get/set-implementation的属性树类数据结构的框架/库?

我正在寻找一个行为类似于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)
  • "路径重载",例如默认为没有注册回调的路径的property_tree实现.

是否有一个接近我正在寻找的图书馆?有没有人boost::property_tree为此目的使用经验?(通过继承或将特殊对象到树像例如描述这里)

c++ boost-propertytree

19
推荐指数
1
解决办法
859
查看次数

标签 统计

boost-propertytree ×10

c++ ×9

boost ×8

json ×4

boost-foreach ×1

iterator ×1

subtree ×1

xml ×1