2013-09-19 4 views
2

Я играю с boost::property_tree::ptree, используя именно следующие json file:Доступ к данным с помощью наддува :: property_tree :: string_path

{ 
    "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). Или я чего-то не хватает?

ответ

3

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

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

Ptree's five minute example использует источник XML, который имеет элемент («модули») с массивом дочерних элементов (каждый из которых называется «модуль»). Как и в вашем случае, единственный способ правильно получить доступ к каждому из них - это итерация результатов get_child()