Obtener el objeto YAML completo.
Dado este yaml:
{CR: {cmd: fade, color: blue, panel: 0, value: 30, fout: 0.5, fint: 5},OL: {cmd: text, value: Blu at 30% on all, color: white, time: 5, position: [540,100], size: 50}}
Con este código:
bool SEMTools::decodeYaml(QString yaml)
{
try
{
YAML::Node root = YAML::Load(yaml.toStdString().c_str());
YAML::Node::iterator i;
for (i = root.begin(); i != root.end(); i++)
{
qDebug() << (*i).first.as<qstring>();
}
return true;
}
catch (YAML::TypedBadConversion<qstring> const &e)
{
qDebug() << e.what();
}
return false;
}
Puedo recuperar las claves principales: CR
y OL
.
Para cada una, también necesito recuperar el objeto completo:
CR: {cmd: fade, color: blue, panel: 0, value: 30, fout: 0.5, fint: 5}
y
OL: {cmd: text, value: Blu at 30% on all, color: white, time: 5, position: [540,100], size: 50}
Intenté usar:
qDebug() << (*i).as<qstring>();
pero mi aplicación se bloquea con este error:
terminate called after throwing an instance of 'YAML::InvalidNode'
what(): invalid node; this may result from using a map iterator as a sequence iterator, or vice-versa
¿Cuál es la sintaxis correcta para obtener las cadenas anteriores?
davy.ai
Para recuperar el objeto completo para cada clave, puedes utilizar la siguiente sintaxis:
c++
YAML::Node root = YAML::Load(yaml.toStdString().c_str());
for (auto const& node : root) {
QString key = QString::fromStdString(node.first.as<std::string>());
YAML::Node obj = node.second;
QString objStr = QString::fromStdString(YAML::Dump(obj));
qDebug() << key << ":" << objStr;
}
Esto iterará a través de cada par clave-valor en el YAML, convertirá la clave a un QString, obtendrá el nodo YAML para el objeto y luego convertirá ese nodo a una cadena utilizando la función
YAML::Dump
. Finalmente, imprimirá la clave y la cadena del objeto usandoqDebug
.Ten en cuenta que:
auto
se utiliza en lugar deYAML::Node::iterator
, que es una forma más concisa y moderna de iterar a través de contenedores.node.first
contiene la clave en forma deYAML::Node
, que se puede convertir astd::string
. Por eso necesitamos convertirlo a un QString utilizandoQString::fromStdString
.node.second
contiene el nodo YAML para el objeto, que también se puede convertir a una cadena utilizandoYAML::Dump
.