Trabajo con JSON en C++: análisis y serialización
JSON (JavaScript Object Notation) sigue siendo uno de los formatos más populares para el intercambio de datos en aplicaciones web, archivos de configuración y API. A pesar de que C++ no tiene soporte integrado para JSON, existen varias bibliotecas potentes que hacen que trabajar con este formato sea simple y eficiente. En este artículo, veremos las dos bibliotecas más populares: nlohmann/json (recomendada para la mayoría de proyectos) y RapidJSON (para tareas donde el rendimiento es crítico). Aprenderá cómo analizar JSON, serializar objetos de vuelta a una cadena y manejar errores.
¿Por qué es necesario JSON en C++?
C++ es un lenguaje de programación de sistemas, pero las aplicaciones modernas requieren cada vez más interacción con servicios web, almacenamiento de configuraciones o intercambio de datos entre microservicios. JSON proporciona un formato conveniente y legible para estas tareas. El uso de bibliotecas para trabajar con JSON en C++ permite:
- Cargar y procesar archivos de configuración (por ejemplo, para motores de juegos o servidores).
- Interactuar con REST API (enviar y recibir datos).
- Guardar y restaurar el estado de estructuras de datos complejas.
- Integrarse con otros lenguajes y sistemas que utilizan JSON.
Biblioteca nlohmann/json: simplicidad y comodidad
La biblioteca nlohmann/json (a menudo llamada "JSON for Modern C++") es quizás la más popular debido a su API intuitiva, que recuerda al trabajo con Python o JavaScript. Soporta C++11 y superior.
Instalación
La forma más sencilla es copiar el único archivo de cabecera json.hpp en su proyecto. Puede descargarlo desde el repositorio oficial o instalarlo a través de un gestor de paquetes (vcpkg, Conan).
Análisis de JSON desde una cadena
Veamos un ejemplo básico de análisis de una cadena JSON y acceso a los datos:
#include <iostream>#include <nlohmann/json.hpp>using json = nlohmann::json;
int main() { // Cadena JSON para analizar std::string json_string = R"({ "name": "C++", "version": 17, "features": ["RAII", "Templates", "Smart Pointers"], "is_compiled": true })";
// Análisis de la cadena en un objeto json json data = json::parse(json_string);
// Acceso a los valores std::cout << "Lenguaje: " << data["name"] << std::endl; std::cout << "Versión: " << data["version"] << std::endl; std::cout << "Compilable: " << data["is_compiled"] << std::endl;
// Acceso al array for (auto& feature : data["features"]) { std::cout << " - " << feature << std::endl; } return 0;}Salida:
Lenguaje: "C++"Versión: 17Compilable: true - "RAII" - "Templates" - "Smart Pointers"Serialización (creación de JSON)
Crear un objeto JSON y convertirlo en una cadena es igual de simple:
#include <iostream>#include <nlohmann/json.hpp>using json = nlohmann::json;
int main() { // Creamos un objeto JSON json person; person["name"] = "Alice"; person["age"] = 30; person["is_student"] = false; person["hobbies"] = {"reading", "coding", "chess"};
// Añadimos un objeto anidado person["address"]["city"] = "Moscow"; person["address"]["zip"] = "101000";
// Serialización a cadena con sangría std::string serialized = person.dump(4); // 4 espacios para sangría std::cout << serialized << std::endl;
return 0;}El método dump(4) devuelve una cadena bellamente formateada. Para una salida compacta, use