【问题标题】:Boost property tree count does not count the childs?提升属性树计数不计算孩子?
【发布时间】:2014-12-05 10:31:37
【问题描述】:

我有一个如下所示的 json:

{"field":{"val1":25, "val2":48, "name1":"qqd"}}

当我对收到的 json 进行验证时,特定字段如下:

std::size_t fcnt = pt.count("field");
std::size_t val1cnt = pt.count("field.val1");
std::size_t val2cnt = pt.count("field.val2");
std::size_t nm1cnt = pt.count("field.name1");
std::cout << fcnt << val1cnt << val2cnt << nm1cnt << std::endl; // this is just for testing
if (fcnt != 1 || val1cnt != 1 || val2cnt != 1 || nm1cnt !=1)
  throw BadJSONFormatException();

我总是得到异常,打印的值是:1000。为什么? count 这样不行吗?

【问题讨论】:

    标签: c++ json boost boost-propertytree


    【解决方案1】:

    文档说:“计算具有给定键的直接子代的数量。”

    换句话说,您传递的字符串是一个简单的键,而不是路径。点不会得到特殊处理。

    我认为让 ptree 拥有双容器/路径接口是它最大的问题。我看到了很多困惑。下一个版本需要考虑的事情。

    【讨论】:

    • 就我个人而言,我从未发现 Boost Property Tree 实际上是正确解决方案的用例。对于 XML,使用例如PugiXML(仅标题!)。对于 JSON,使用任何 json 解析器,对于 INI 文件,使用一个简单的解析器(我在 SO 答案中有 2 个左右 :))。在我看来,对于这些后端中的任何一个,Property Tree 的功能基本上都被削弱了,几乎/无法控制往返保真度。而且它有 API 怪癖来启动。
    • 我要说的唯一事情是(a)它在 boost 中(b)它有一个单一的接口(尽管这是一个非常泄漏的抽象!)(c)它有一条 wchar_t 腿 OotB。
    • 其实我认为你不应该将属性树视为某些配置文件的解析器,而应将其视为容器。可以从不同的源格式填充容器这一事实很重要,但不是基本的。在我的用例中,我将其用作接口具体实现的配置参数的多功能容器
    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多