【问题标题】:How can I create empty array node using boost property_tree of json parser如何使用 json 解析器的 boost property_tree 创建空数组节点
【发布时间】:2015-06-05 09:40:25
【问题描述】:

我正在尝试在json中创建一个数组节点,其输出是这样的:

{
    node: ["12", "13"]
}

但是当数组为空时,它会输出这个:

{
    node: ""
}

这不是我想要的,我需要这个:

{
    node: []
}

我该怎么做? 而且我不需要数字周围的双引号(“”)。 有人可以帮忙吗?

我的代码如下:

boost::property_tree::ptree pt;
boost::property_tree::ptree array;
for (vector<int>::const_iterator iter = v.begin();
    iter != v.end();
    ++iter)
{
    boost::property_tree::ptree node;
    node.put("code", *iter);
    array.push_back(std::make_pair("", node));
}
pt.add_child("array", array);

感谢您的关注。

【问题讨论】:

    标签: c++ arrays json boost


    【解决方案1】:

    PSA Boost 1.75.0 引入了 Boost JSON;它可以这样做:Live Demo

    std::cout << json::object{{"node", json::array{}}};
    

    Boost 没有 JSON 库。它有一个属性树(想想:分层配置格式)库。

    文档:http://www.boost.org/doc/libs/1_58_0/doc/html/property_tree/parsers.html#property_tree.parsers.json_parser

    它特别指出有些东西没有得到很好的支持:

    • JSON 中的数组是一个 hack(你不能代表空数组)
    • 所有类型信息都丢失了(一切都需要是 JSON 字符串)

    这适合 Boost PropertyTree 的预期应用领域。如果它不适合您的问题,请使用 JSON 库。

    【讨论】:

      【解决方案2】:

      此答案假定,在稍后阶段,您将创建一个属性树字符串。对于这种情况,我找到了一些解决方法。 而不是创建

      {
         "node": ""
      }
      

      您可以轻松创建

      {
         "node": [""]
      }
      

      通过做

      ptree parent_tree, children, child;
      
      children.push_back(std::make_pair("", child));
      pt.add_child("node", children);
      

      稍后,当您有 json 的字符串表示形式时,您可以将字符 [""] 替换为 []。为此,您只需要这样做:

      #include <boost/algorithm/string.hpp>
      
      boost::replace_all(json_string, "[\"\"]", "[]");
      

      这样,你最终会得到一个包含

      的字符串
      {
         "node": []
      }
      

      希望这会有所帮助。

      【讨论】:

      • 这对我的一个项目帮助很大(在我意识到它的所有限制之前开始使用 boost 的 ptree,我现在不想切换到其他东西,除非我必须这样做。)谢谢你!
      猜你喜欢
      • 1970-01-01
      • 2015-01-12
      • 2011-04-14
      • 2013-03-03
      • 2015-08-14
      • 2023-03-21
      • 2018-01-04
      • 2013-06-12
      • 2018-06-25
      相关资源
      最近更新 更多