我刚开始使用boost::property_tree::ptree
,遇到了麻烦。
我正在使用ptree
来解析以下JSON
:
{"num_faces": 1, "faces": [{"group_name": {"string": "Sprockets", "size": 9}, "box": {"max_corner": {"col": 0.3804014213811271, "row": 0.6124153645658}, "min_corner": {"col": 0.15280030811083334, "row": 0.17096449870806352}}, "group_id": 19955298, "id": 9953124, "name": {"string": "Spacely", "size": 7}}]}
使用流将JSON
导入ptree
很容易。我使用了ptree
的递归遍历来打印出它的值(基本上是转储其JSON
的内容),如下所示:
{
"num_faces": "1",
"faces":
{
"":
{
"group_name":
{
"string": "Sprockets",
"size": "9"
},
"box":
{
"max_corner":
{
"col": "0.3804014213811271",
"row": "0.6124153645658"
},
"min_corner":
{
"col": "0.15280030811083334",
"row": "0.17096449870806352"
}
},
"group_id": "19955298",
"id": "9953124",
"name":
{
"string": "Spacely",
"size": "7"
}
}
}
}
接下来,我想将ptree
转换为以下struct
层次结构:
struct Box {
std::tuple<float,float> min_corner;
std::tuple<float,float> max_corner;
};
struct Face {
uint32_t id;
uint32_t group_id;
std::string name;
std::string group_name;
Box box;
};
struct ResponsePacket {
uint32_t num_faces;
std::vector<Face> faces;
};
我考虑过进行另一个递归遍历以遍历树的所有值,并将它们分配给上面定义的struct
。但是,我的一部分认为这种类型的数据结构过大。在get
的{{1}}和get_child
访问器函数之间,我应该能够执行所需的操作。
这适用于第一级,因为我可以轻松地ptree
get
字段,但是不幸的是,当我尝试通过num_faces
节点时,这种情况会分解旨在成为一个清单。这里似乎缺少文档示例。
我知道我可以使用faces
来获取get_child
之后的列表,但这就是我遇到的问题。如果我使用faces
进行迭代,例如使用:
BOOST_FOREACH
然后,我可以使用BOOST_FOREACH(const ptree::value_type &v, pt.get_child("faces")) {
...
}
作为子名称,然后使用v.first
作为子树,但是我可以再次使用v.second
和get
访问子树?子树在什么结构中?仅仅是get_child
的子树吗?
基本上,我正在寻找如何在该级别访问数据,因此可以将其填充到ptree
s中。
预先感谢您的帮助。