【问题标题】:Can this boost ptree block be shorter (and smarter)?这个 boost ptree 块可以更短(更智能)吗?
【发布时间】:2021-05-02 07:30:14
【问题描述】:

我正在创建一个利用 boost ptree 库的 JSON 字符串,但我发现仅执行以下操作就很乏味。我需要向metrics ptree 添加一个简单的数组,例如"metric.name" : [A, B]。我能做得比这更好吗?或者至少以更简洁的方式编写。

      pt::ptree metric_avg;
      metric_avg.put("", 9999);
      pt::ptree metric_std;
      metric_std.put("", 0);
      pt::ptree metric_distr;
      metric_distr.push_back({"", metric_avg});
      metric_distr.push_back({"", metric_std});
      metrics.add_child(metric.name, metric_distr);

【问题讨论】:

  • 你最好使用 json 库,ptree 很方便,但如果你想要一个特定的 JSON 输出,你会遇到限制
  • 您对此有什么建议吗?我在这个项目中大量使用 ptree,而 json 格式只出现了 2/3 次,所以我宁愿坚持使用 ptree,只要我能做我需要做的事情。
  • nlohman 很容易使用并且语法很好

标签: c++ boost ptree


【解决方案1】:

我会写一些辅助函数

template<typename T>
pt::ptree scalar(const T & value)
{
    pt::ptree tree;
    tree.put("", value);
    return tree;
}

template<typename T>
pt::ptree array(std::initialiser_list<T> container)
{
    pt::ptree tree;
    for (auto & v : container)
    { 
        tree.push_back(scalar(v));
    }
    return tree;
}

这样你就可以写了

metrics.put(metric.name, array({ 9999, 0 }));

【讨论】:

  • 是的,这可能是我坚持使用 ptree 的最佳镜头。谢谢。
【解决方案2】:

我愿意:

Live On Coliru

ptree metric_avg;
auto& arr = metric_avg.put_child("metric name", {});
arr.push_back({"", ptree("9999")});
arr.push_back({"", ptree("0")});

Live On Coliru

for (auto el : {"9999", "0"})
    arr.push_back({"", ptree(el)});

甚至Live On Coliru

for (auto el : {9999, 0})
    arr.push_back({"", ptree(std::to_string(el))});

全部打印出来

{
    "metric name": [
        "9999",
        "0"
    ]
}

另见JSON Array using Boost::Ptree

【讨论】:

  • 我发现@Caleth 的答案更通用、更灵活,我最终编写了自己的模板函数,但你的函数直奔我最初寻找的方向,所以无论如何谢谢。
  • 哦,是的,我之前为 @Caleth 的回答 +1 了。不错!
猜你喜欢
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多