Trabajo con JSON en C++: análisis y serialización en la práctica
JSON (JavaScript Object Notation) es uno de los formatos de intercambio de datos más populares en las aplicaciones modernas. A pesar de que C++ no tiene soporte integrado para JSON, existen muchas bibliotecas que facilitan el trabajo con este formato. En este artículo, exploraremos los aspectos prácticos del análisis y la serialización de JSON en C++ utilizando la biblioteca nlohmann/json, una de las más populares y fáciles de usar.
¿Por qué elegir nlohmann/json?
La biblioteca nlohmann/json (a menudo llamada JSON for Modern C++) ha ganado popularidad gracias a su API intuitiva, similar al trabajo con contenedores STL. Es header-only (no requiere compilación), compatible con C++11 y superior, y ofrece alto rendimiento y seguridad de tipos.
La instalación de la biblioteca es sencilla: basta con descargar el archivo de cabecera json.hpp o usar un gestor de paquetes como vcpkg, Conan o CMake FetchContent.
#include <nlohmann/json.hpp>using json = nlohmann::json;Fundamentos del análisis de JSON en C++
El análisis de JSON es el proceso de convertir una cadena en datos estructurados. La biblioteca nlohmann/json proporciona varias formas de realizar el análisis.
Análisis desde una cadena
La forma más común es usar el método estático json::parse():
#include <iostream>#include <string>#include <nlohmann/json.hpp>
int main() { std::string json_string = R"({ "name": "Iván", "age": 30, "is_student": false, "skills": ["C++", "Python", "JavaScript"], "address": { "city": "Moscú", "zip": "101000" } })";
try { json data = json::parse(json_string); // Acceso a los datos std::cout << "Nombre: " << data["name"] << std::endl; std::cout << "Edad: " << data["age"] << std::endl; std::cout << "Estudiante: " << (data["is_student"] ? "sí" : "no") << std::endl; // Trabajo con arreglos for (auto& skill : data["skills"]) { std::cout << "Habilidad: " << skill << std::endl; } // Trabajo con objetos anidados std::cout << "Ciudad: " << data["address"]["city"] << std::endl; } catch (json::parse_error& e) { std::cerr << "Error de análisis: " << e.what() << std::endl; } return 0;}Análisis desde un archivo
Para trabajar con archivos, use los flujos de entrada/salida de C++:
#include <fstream>#include <nlohmann/json.hpp>
int main() { std::ifstream file("data.json"); if (!file.is_open()) { std::cerr << "No se pudo abrir el archivo" << std::endl; return 1; } try { json data = json::parse(file); std::cout << "Datos cargados: " << data.dump(2) << std::endl; } catch (json::parse_error& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}Serialización de JSON en C++
La serialización es el proceso inverso: convertir datos de C++ en una cadena JSON. La biblioteca ofrece el método dump() con capacidad de formato.
Creación de un objeto JSON
Puede crear objetos JSON directamente, como arreglos asociativos normales:
#include <nlohmann/json.hpp>#include <iostream>
int main() { json person; person["name"] = "María"; person["age"] = 25; person["is_employed"] = true; person["languages"] = {"Ruso", "Inglés", "Alemán"};