Разбор иерархического property_tree (ptree) - PullRequest
0 голосов
/ 17 марта 2020

Я только что начал работать с 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;
};

Я подумал сделать еще один рекурсивный обход go через все значения дерева, назначив их struct, определенным выше. Часть меня, однако, думает, что это избыточно для такого типа структуры данных. Между get и get_child функциями доступа ptree я должен иметь возможность делать то, что мне нужно.

Это работает для первого уровня, так как я легко могу get num_faces поле, но, к сожалению, это не работает, когда я пытаюсь go через узел 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?

В основном я ищу способ доступа к данным на этом уровне, поэтому я могу просто вставить их в struct s.

Заранее спасибо за помощь.

...