对于Boost.Propertytree,是否可以使用JSON点表示法引用数组元素?

时间:2019-06-21 17:39:03

标签: c++ json boost boost-propertytree

能够指定包含数组的Boost.PropertyTree的路径是很棒的。

我可以从此JSON构造Boost.PropertyTree:

const char* theJSONTestText = R"FooArrayTest({
    "FooArray": [
                 {"BarIntValue": 10, "BarString": "some string"},
                 {"BarIntValue": 99, "BarString": "another string"},
                 {"BarIntValue": 45, "BarString": "a third string"}
    ]
})FooArrayTest";

构造并按预期打印:

FooArray: 
: 
BarIntValue: 10
BarString: some string
: 
BarIntValue: 99
BarString: another string
: 
BarIntValue: 45
BarString: a third string

当然,数组的各个元素没有名称。

我知道如何遍历FooArray属性,但是通过JSON点表示法路径(例如“ FooArray [2] .BarString”)访问各个元素来访问第三个字段将特别方便。数组元素:

std::string theSecondBarString = theParsedTree.get<std::string>("FooArray[2].BarString");

当然,这会引发异常,因为我猜Boost.PropertyTree不知道如何使用数组说明符处理路径?还是语法错误?

我为什么要这样做?

我希望此PropertyTree的客户端不仅能够从特定数组元素获取数据,而且还能够设置(即更改)特定数组元素的数据。如果没有简单的路径符号,则客户端必须使用我发明的API函数首先提取然后访问所需的字段,然后反向将其写回。对于在数组元素中包含数组元素的树节点而言,这可能是乏味且容易出错的。

1 个答案:

答案 0 :(得分:0)

难以置信的

这种语法正好构成了我要寻找的东西:

const char* theJSONTestText = R"FooArrayTest({
    "SomeArray": {
        "[1]":  {"BarIntValue": 10, "BarString": "some string"},
        "[2]":  {"BarIntValue": 99, "BarString": "another string"},
        "[3]": {"BarIntValue": 45, "BarString": "a third string"}
    }
})FooArrayTest";

...将创建如下所示的PropertyTree:

DUMP OF parsed JSON:
SomeArray: 
[1]: 
BarIntValue: 10
BarString: some string
[2]: 
BarIntValue: 99
BarString: another string
[3]: 
BarIntValue: 45
BarString: a third string

...并允许使用以下语法:

std::string theSecondBarString = theParsedTree.get<std::string>("SomeArray.[2].BarString");

...以及-VOILA:

Second bar string = another string

重要提示:必须注意,此方法在原始JSON定义文本中放弃了数组标记“ [”,“]”。相反,我只是使用名称“ [n]”创建SomeArray的CHILD NODES。每个子节点([1],[2],[3])都有其带有OWN子节点的BarIntValue和BarString。不是我所期望的,但是可以正常工作!

现在,我只需要弄清楚如何使用成员函数(相对于原始JSON)来构造PropertyTree,那我真是金!!