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 deQJsonValue.QJsonArray: Modela un array JSON, una secuencia ordenada de valores de tipoQJsonValue.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();
}
}