Я только что начал работать с 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.
Заранее спасибо за помощь.