Доступ к значениям с помощью boost :: property_tree :: string_path

Я играю с повышение :: property_tree :: Ptree, используя именно следующее JSON файл:

{
"menu":
{
"foo": "true",
"bar": "true",
"value": "102.3E+06",
"popup":
[
{
"value": "New",
"onclick": "CreateNewDoc()"},
{
"value": "Open",
"onclick": "OpenDoc()"}
]
}
}

Я безуспешно пытался получить доступ к вложенным «значениям», вот что я сделал:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/foreach.hpp>

int main(int argc, char *argv[])
{
const char *filename = argv[1];
using boost::property_tree::ptree;
ptree pt;

read_json(filename, pt);

std::string v0 = pt.get<std::string>("menu.value"); // ok
//std::string v1 = pt.get<std::string>("menu.popup.value"); // not ok
//std::string v2 = pt.get<std::string>("menu.popup.1.value"); // not ok
//std::string v3 = pt.get<std::string>("menu.popup.''.value"); // not ok

// ugly solution:
BOOST_FOREACH(ptree::value_type &v,
pt.get_child("menu.popup"))
{
const ptree &pt2 = v.second;
std::string s = pt2.get<std::string>("value");
}
return 0;
}

Все мои попытки «не хорошо» до сих пор не удалось. Кажется, что string_path не позволяет получить доступ ко всему ptree, как можно себе представить (представьте XPath в мире XML). Или я что-то упустил?

2

Решение

Дерево свойств (по состоянию на 1.54) не поддерживает массивы. Вы можете увидеть, как сериализатор JSON ptree транслирует объекты массива JSON в подходящие (безымянные; ключ = «») узлы Вот.

Строковые пути Ptree разрешают значения путем ключа (где имена ключей разделены точками). Поскольку объекты массива заканчиваются как неназванные узлы, невозможно получить доступ к отдельным узлам без итерации дочерних узлов корневого узла (в данном случае «всплывающее окно»). Вы можете прочитать о том, как использовать различные перегрузки get () здесь

Пятиминутный пример Ptree использует источник XML, который имеет элемент («modules») с массивом дочерних элементов (каждый из которых называется «module»). Как и в вашем случае, единственный способ правильно получить доступ к каждому из них — это итерировать результаты get_child ().

3

Другие решения

Других решений пока нет …