Análisis de JSON en Qt

El framework Qt ofrece herramientas robustas para el manejo de JSON, permitiendo parsear y manipular datos de manera eficiente. Este artículo aborda los fundamentos del formato JSON y cómo utilizar las clases específicas de Qt para su procesamiento.

Clases principales de Qt para JSON

Para trabajar con JSON en Qt, se emplean cuatro clases clave:

  • QJsonObject: Rperesenta un objeto JSON, una colección de pares donde las claves son cadenas y los valores son instancias de QJsonValue.
  • QJsonArray: Modela un array JSON, una secuencia ordenada de valores de tipo QJsonValue.
  • QJsonValue: Encapusla un valor JSON individual, que puede ser booleano, numérico, cadena, objeto, array o nulo.
  • QJsonDocument: Actúa como documento raíz para parsear cadenas JSON y convertirlas en estructuras de objetos o arreglos, y viceversa.

Etsructuras comunes de JSON

JSON se basa en dos estructuras fundamentales:

Objetos: Definidos por llaves {}, contienen pares clave-valor. Ejemplo:


{
  "empleado": "Laura",
  "departamento": "Ventas",
  "activo": false,
  "proyectos": ["ProyectoA", "ProyectoB"]
}

Arrays: Encerrados entre corchetes [], son listas ordenadas de valores. Ejemplo:


[
  "rojo",
  25,
  true,
  {"color": "azul"},
  [1, 2, 3]
]

Ejemplos prácticos de parsing

El proceso típico implica convertir una cadena JSON en un QJsonDocument y luego extraer datos. A continuación, varios escenarios ilustrativos.

Parsear un array de cadenas

Dado el JSON:


["Lunes", "Martes", "Miércoles"]

Código de extracción:


QByteArray inputJson = R"(["Lunes", "Martes", "Miércoles"])";
QJsonParseError parseError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(inputJson, &parseError);

if (parseError.error == QJsonParseError::NoError && jsonDoc.isArray()) {
    QJsonArray dayArray = jsonDoc.array();
    for (const auto &item : dayArray) {
        if (item.isString()) {
            qDebug() << item.toString();
        }
    }
}

Parsear un objeto con diferentes tipos de valores

JSON:


{
  "producto": "Monitor",
  "precio": 250.5,
  "disponible": true
}

Código:


QByteArray inputJson = R"({"producto": "Monitor", "precio": 250.5, "disponible": true})";
QJsonDocument jsonDoc = QJsonDocument::fromJson(inputJson, &parseError);

if (parseError.error == QJsonParseError::NoError && jsonDoc.isObject()) {
    QJsonObject productObj = jsonDoc.object();
    QString name = productObj.value("producto").toString();
    double cost = productObj.value("precio").toDouble();
    bool inStock = productObj.value("disponible").toBool();
    qDebug() << "Producto:" << name << ", Costo:" << cost << ", Disponible:" << inStock;
}

Procesar un array que contiene objetos

JSON:


[
  {"nombre": "Ana", "edad": 28},
  {"nombre": "Carlos", "edad": 35}
]

Código:


QByteArray inputJson = R"([
  {"nombre": "Ana", "edad": 28},
  {"nombre": "Carlos", "edad": 35}
])";
QJsonDocument jsonDoc = QJsonDocument::fromJson(inputJson, &parseError);

if (parseError.error == QJsonParseError::NoError && jsonDoc.isArray()) {
    QJsonArray peopleArray = jsonDoc.array();
    for (int index = 0; index < peopleArray.size(); ++index) {
        QJsonObject personObj = peopleArray.at(index).toObject();
        qDebug() << "Nombre:" << personObj["nombre"].toString()
                 << ", Edad:" << personObj["edad"].toInt();
    }
}

Manejar un objeto que incluye un array

JSON:


{
  "equipo": "Desarrollo",
  "miembros": ["Sofía", "Diego", "Elena"]
}

Código:


QByteArray inputJson = R"({"equipo": "Desarrollo", "miembros": ["Sofía", "Diego", "Elena"]})";
QJsonDocument jsonDoc = QJsonDocument::fromJson(inputJson, &parseError);

if (parseError.error == QJsonParseError::NoError && jsonDoc.isObject()) {
    QJsonObject teamObj = jsonDoc.object();
    QString teamName = teamObj.value("equipo").toString();
    QJsonArray memberList = teamObj.value("miembros").toArray();
    qDebug() << "Equipo:" << teamName;
    for (const auto &member : memberList) {
        qDebug() << "-" << member.toString();
    }
}

Etiquetas: Qt json QJsonDocument QJsonObject QJsonArray

Publicado el 6-19 06:44