Разбор 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>();
Очевидно, это было бы довольно неприятно, если бы вы на самом деле хотели, чтобы это было так, поскольку это означает, что вам больше не нужно использовать ключи, но вам придется либо иметь дело с порядком, либо повторно обрабатывать конфигурацию, чтобы избавиться от уровня массива.