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

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

Sto usando yaml-cpp per i miei file di configurazioneanalizzando perché devo essere in grado di analizzare i file yaml e json e questa è l'unica libreria cpp che supporta yaml 1.2 che ho trovato. Durante l'analisi, non chiedo la chiave perché non so per quale componente è il file di configurazione corrente. Inoltre sto usando ncurses per visualizzare il contenuto del file di configurazione.

Durante l'analisi dei file di configurazione che includono gli array, non riesco a ottenere questi array. Il programma li salta semplicemente.

Esempio di file di configurazione yaml:

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

Esempio di file di configurazione di 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
}

Il mio codice:

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;
}

Chiavi che ottengo dal file yaml:

VIRTCAM_IDS
SLICE_POSITION
SLICE_HEIGHT
OUTPUT_ADDRESS

Chiavi che sto ottenendo dal file json:

uuid
mappings
width
device
sensor_type
target
height
x
active_quadrangle
y

Quindi qualcuno può dirmi come analizzare questo, così posso arrivare agli array (e ai loro valori)? C'è anche un modo per ottenere gli articoli nel giusto ordine?

Grazie per qualsiasi risposta!

risposte:

1 per risposta № 1

Quando esegui il looping della mappa, stai solo leggendo i tasti con it->first. Per leggere anche i valori, è necessario 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.
}
}