Как получить доступ к массиву JSON с boost :: property_tree? - PullRequest
8 голосов
/ 01 июля 2011
{
    "menu": 
    {
        "foo": true,
        "bar": "true",
        "value": 102.3E+06,
        "popup": 
        [
            {"value": "New", "onclick": "CreateNewDoc()"},
            {"value": "Open", "onclick": "OpenDoc()"},
        ]
    }
}

Как я могу получить значение onclick?

1 Ответ

16 голосов
/ 02 июля 2011

Итерация по дочерним узлам menu.popup и извлечение значений onclick:

void print_onclick_values(const ptree& node)
{
    BOOST_FOREACH(const ptree::value_type& child,
                  node.get_child("menu.popup")) {
        std::cout
            << "onclick: "
            << child.second.get<std::string>("onclick")
            << "\n";
    }
}

Функция печатает:

onclick: CreateNewDoc()
onclick: OpenDoc()

NB Удалите запятую из запятойпример:

{"value": "Open", "onclick": "OpenDoc()"},

Вы не можете получить доступ к определенным дочерним элементам массива, используя один вызов get<string>(path) или get_child(path). В руководстве написано :

В зависимости от пути, результат на каждом уровне может быть не полностью определенным, т. Е. Если один и тот же ключ появляется несколько раз, то выбранный дочерний элемент не являетсяуказано.Это может привести к тому, что путь не будет разрешен, даже если есть путь с этим путем.Пример:

a -> b -> c
  -> b

Путь «abc» будет успешным, если разрешение «b» выберет первый такой узел, но потерпит неудачу, если он выберет второй.

Все элементы массива JSON имеют пустую строку в качестве имени.Вы можете получить доступ к onclick значению элемента массива с помощью

void print_arbitrary_onclick_value(const ptree& node)
{
    std::cout << node.get<std::string>("menu.popup..onclick") << "\n";
}

, но вы не знаете, для какого элемента предпринимается попытка доступа к onclick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...