【问题标题】:JSON Array using Boost::Ptree使用 Boost::Ptree 的 JSON 数组
【发布时间】:2020-09-22 19:47:39
【问题描述】:

如何创建一个可以编码为低于 JSON 的 boost ptree?即我想知道如何在 boost ptree 中表示 JSON 对象的 JSON 数组..

[
{"3":"SomeValue"},
{"40":"AnotherValue"},
{"23":"SomethingElse"},
{"9":"AnotherOne"},
{"1":"LastOne"}
]

我必须说下面的链接没有回答: Creating JSON arrays in Boost using Property Trees

【问题讨论】:

    标签: json boost


    【解决方案1】:

    链接确实回答了它。所有答案都清楚地表明您应该使用push_back(实际上是insert),而不是put_child

    您还必须阅读“如何制作数组”并意识到您不能将数组作为文档根目录

    这是 Boost Ptree 不是 JSON 库这一事实的征兆。它是一个属性树库,它只支持属性树。这些限制已记录在案:

    https://www.boost.org/doc/libs/1_74_0/doc/html/property_tree/parsers.html#property_tree.parsers.json_parser

    演示

    这是你能做的最好的,假设你并不真的需要数组作为文档根:

    Live On Coliru

    #define BOOST_BIND_GLOBAL_PLACEHOLDERS 
    #include <boost/property_tree/json_parser.hpp>
    #include <iostream>
    
    using boost::property_tree::ptree;
    
    int main() {
        ptree arr;
    
        for (auto [k,v]: { std::pair
                {"3",  "SomeValue"},
                {"40", "AnotherValue"},
                {"23", "SomethingElse"},
                {"9",  "AnotherOne"},
                {"1",  "LastOne"} })
        {
            ptree element;
            element.put(k, v);
            arr.push_back({"", element});
        }
    
        // can't have array at root of doc...
        ptree doc;
        doc.put_child("arr", arr);
        write_json(std::cout, doc);
    }
    

    打印

    {
        "arr": [
            {
                "3": "SomeValue"
            },
            {
                "40": "AnotherValue"
            },
            {
                "23": "SomethingElse"
            },
            {
                "9": "AnotherOne"
            },
            {
                "1": "LastOne"
            }
        ]
    }
    

    【讨论】:

    • 您可以通过一些努力来解决此问题,而不是参考 ptree/wptree,而是参考基本属性树以及自定义类型的变体。当然,这也需要对阅读器进行一些扩展,并且您必须编写自己的 JSon-Writer(通常是简单的任务)。
    • @Secundi 一般来说,这不是一项简单的任务,当您完成所有这些工作时,无论如何使用 JSON 库会好得多。我无法想象属性树库的什么属性 [原文如此] 让您对添加的耦合/尴尬感兴趣
    • property_tree> 的实现对于任何中级 C++ 开发人员来说都是一件容易的事。对于其他东西,我承认可能需要一些额外的努力。我花了 1 1/2 天的时间才使这棵树完全符合要求,而且我还不是高级开发人员(还......)。为什么要提到树?据我所知,这是一种广泛使用的数据类型。无需对软件进行全面重新设计,重构将是一件容易的事。而且树属性本身也很有用。
    • “据我所知,这是一种广泛使用的数据类型。” - 不是我住的地方。我看到它使用的唯一时间是滥用 XML 或 JSON“支持”。我经常编写自己的树数据结构,我认为使用 btree 比使用变体+容器直接拼写没有任何吸引力。树木分布广泛。属性树不是。但是感谢您提供另一个 POV
    • 事实上,boost 的属性有几个缺点和问题(可调试性差,boost 标头/符号爆炸......)但至少如果你在 stackoverflow 中搜索,关于它的问题有数千个,甚至有几十个仅针对此处讨论的有关 JSON 格式的特定问题。编写自己的树结构可能足以满足许多本地目的,但如果您必须为更大的项目世界提供它,事情可能会变得非常快,因为数据类型必须确保几个更高的方面(迭代器行为、转换行为, getter/setter 特征/策略)。
    猜你喜欢
    • 2023-04-06
    • 2021-11-26
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多