/ / Parsing json / yaml array con yaml-cpp - c ++, arreglos, json, yaml, yaml-cpp

Analizando la matriz json / yaml con yaml-cpp - c ++, arreglos, json, yaml, yaml-cpp

Estoy usando yaml-cpp para mis archivos de configuraciónanálisis porque tengo que poder analizar los archivos yaml y json y esta es la única biblioteca de cpp que admite yaml 1.2 que he encontrado. Al analizar, no pido una clave porque no sé para qué componente se encuentra el archivo de configuración actual. También estoy usando ncurses para mostrar el contenido del archivo de configuración.

Al analizar los archivos de configuración que incluyen matrices, no obtengo estas matrices. Programa simplemente los salta.

Ejemplo de archivo de configuración yaml:

SLICE_POSITION: 285
SLICE_HEIGHT: 15
OUTPUT_ADDRESS: "localhost:3335"
VIRTCAM_IDS:
- 0
- 1
- 2

Ejemplo de archivo de configuración json:

{
"width" : 1366,
"mappings" : {
"x" : [ "mt_position_x" ],
"y" : [ "mt_position_y" ]
},
"active_quadrangle" : {
"bottom_left" : "[1472;4698;0]",
"bottom_right" : "[5654;4698;0]",
"top_left" : "[1472;1408;0]",
"top_right" : "[5654;1408;0]"
},
"x" : 0.0,
"y" : 0.0
}

Mi código:

YAML::Node config = YAML::LoadFile(fileName);
for(YAML::const_iterator it = config.begin(); it != config.end();) {
const char* key = (it->first.as<std::string>()).c_str();
mvprintw(i, 4, key);
i++; // row number
++it;
}

Llaves que estoy obteniendo de archivo yaml:

VIRTCAM_IDS
SLICE_POSITION
SLICE_HEIGHT
OUTPUT_ADDRESS

Llaves que estoy recibiendo de archivo json:

uuid
mappings
width
device
sensor_type
target
height
x
active_quadrangle
y

Entonces, ¿alguien puede decirme, cómo analizar esto, para poder llegar a los arreglos (y sus valores)? ¿También hay alguna manera de que pueda obtener los artículos en el orden correcto?

Gracias por cualquier respuesta!

Respuestas

1 para la respuesta № 1

Cuando "recorres el mapa, solo estás leyendo las teclas con it->first. Para leer los valores también, necesitas it->second:

YAML::Node config = YAML::LoadFile(fileName);
for (YAML::const_iterator it = config.begin(); it != config.end(); ++it) {
std::string key = it->first.as<std::string>();
YAML::Node value = it->second;
// here, you can check what type the value is (e.g., scalar, sequence, etc.)
switch (value.Type()) {
case YAML::NodeType::Scalar: // do stuff
case YAML::NodeType::Sequence: // do stuff
// etc.
}
}