es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for 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 usando qDebug.

    Ten en cuenta que:

    • La palabra clave auto se utiliza en lugar de YAML::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 de YAML::Node, que se puede convertir a std::string. Por eso necesitamos convertirlo a un QString utilizando QString::fromStdString.
    • node.second contiene el nodo YAML para el objeto, que también se puede convertir a una cadena utilizando YAML::Dump.

Comments are closed.