解析分层property_tree(ptree)

时间:2020-03-16 21:14:48

标签: c++ json boost boost-propertytree ptree

我刚开始使用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.secondget访问子树?子树在什么结构中?仅仅是get_child的子树吗?

基本上,我正在寻找如何在该级别访问数据,因此可以将其填充到ptree s中。

预先感谢您的帮助。

0 个答案:

没有答案