2014-12-15 2 views
2

Я искал ответ на этот вопрос, но не могу найти что-либо извините, если это было задано раньше. У меня есть следующий файл JSonBoost узел ptree для всех детей в массиве json

{"GuiComponents": [ 
{ 
    "GuiComponent": 
    { 
     "screen": "WindowMain", 
     "type": "class Robot", 
     "filename": "robot.mesh", 
     "blueprint": "Betplacement/Robot.json", 
     "layer": "0", 
     "position": 
     { 
      "x": "0", 
      "y": "0" 
     } 
    } 
}, 
{ 
    "GuiComponent": 
    { 
     "screen": "WindowTop", 
     "type": "class Robot", 
     "filename": "robot.mesh", 
     "blueprint": "Betplacement/Robot.json", 
     "layer": "0", 
     "position": 
      { 
      "x": "0", 
      "y": "0" 
      } 
     } 
    } 
] 
} 

Теперь я хочу, чтобы перебрать все дети в GuiComponents называемых GuiComponent и присвоить каждому ребенку к узлу Ptree. Таким образом, я могу просто передать узел ptree всем, кто хочет получить данные для конкретного GuiComponent, не видя всех других детей. Я не могу найти способ сделать это с помощью get_child, поскольку он просто генерирует исключение «Нет такого узла GuiComponent».

Любая помощь была бы принята с благодарностью.

Благодаря

+0

Можете ли вы предоставить пример того, как вы пытаетесь получить доступ к узлам с помощью 'get_child()'? – piwi

+0

Я пробовал boost :: property_tree :: ptree child = m_tree.get_child ("GuiComponents.GuiComponent") и boost :: property_tree :: ptree child = m_tree.get_child ("GuiComponent"). Спасибо – codetemplar

ответ

0

GuiComponent Ваших элементов хранятся в безымянных элементах массива; при чтении данных JSON Boost.PropertyTree будет "translate" array elements into children of empty nodes.

Вот что вы можете попробовать: поиск пустых узлов, а затем искать элементы GuiComponent внутри каждого узла, используя equal_range() метод:

auto array_iter = m_tree.equal_range(""); 
for (auto i: array_iter) { 
    auto gui_iter = i->second.equal_range("GuiComponent"); 
    for (auto gui_component: gui_iter) { 
    // ... 
    } 
} 

итератор на величинуХ Ptree указывает на пары, где первым element - это имя узла, а второй элемент - ptree.

+0

Не возвращает ничего полезного. result.first равен результату. второй. Ta – codetemplar

+0

@codetemplar Я обновил свой ответ: поскольку у вас есть массив в ваших данных JSON, ptree преобразует его в неназванные узлы. – piwi