Разбор yaml с yaml cpp

Я пытаюсь разобрать yaml usign yaml-cpp. Это мой ямл

--- 
configuration: 
  - height: 600
  - widht:  800
  - velocity: 1
  - scroll: 30
types: 
  - image: resources/images/grass.png
    name: grass
  - image: resources/images/water.png
    name: water
 version: 1.0

Когда я делаю

YAML::Node basenode = YAML::LoadFile("./path/to/file.yaml");
int height;
if(basenode["configuration"])
    if(basenode["configuration"]["height"]
       height = basenode["configuration"]["height"].as<int>();
    else
       cout << "The node height doesn't exist" << endl;
else
    cout << "The node configuration doesn't exist" <<  endl;

Я получаю сообщение: "Высота узла не существует". Как я могу получить доступ к этому полю (и другим?)

Большое спасибо!

1 ответ

Решение

Синтаксис, который вы использовали с - создает элементы массива. Это означает, что вы создаете (в нотации JSON):

{configuration: [{height: 600}, {width: 800}, {velocity: 1}, {scroll: 30}]}

Но то, что вы хотите, это:

{configuration: {height: 600, width: 800, velocity: 1, scroll: 30}}

К счастью, решение легко. Просто удали ошибочную - персонажи:

---
configuration: 
  height: 600
  width:  800
  velocity: 1
  scroll: 30
types: 
  - image: resources/images/grass.png
    name: grass
  - image: resources/images/water.png
    name: water
version: 1.0

Обратите внимание, что я также исправил опечатку widht в ширину и удалил постороннее пространство передversion: 1.0

Если вам интересно, как бы вы на самом деле получили доступ к вашей конфигурации, как сейчас, вам нужно будет получить доступ к массиву:

int height = basenode["configuration"][0]["height"].as<int>();
int height = basenode["configuration"][1]["width"].as<int>();

Очевидно, это было бы довольно неприятно, если бы вы на самом деле хотели, чтобы это было так, поскольку это означает, что вам больше не нужно использовать ключи, но вам придется либо иметь дело с порядком, либо повторно обрабатывать конфигурацию, чтобы избавиться от уровня массива.

Другие вопросы по тегам