Introducción al trabajo con JSON en C++
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos, ampliamente utilizado en desarrollo web, archivos de configuración e interfaces API. Aunque C++ no tiene soporte incorporado para JSON, existen muchas bibliotecas confiables que simplifican el parsing (análisis) y la serialización (conversión a cadena) de datos. En este artículo, exploraremos dos bibliotecas populares: nlohmann/json (recomendada para principiantes y proyectos modernos) y Boost.PropertyTree (para quienes ya usan Boost). Aprenderá a leer, crear, modificar y generar datos JSON en C++.
Biblioteca nlohmann/json: instalación y conceptos básicos
La biblioteca nlohmann/json (a menudo llamada "JSON for Modern C++") es una de las más populares debido a su simplicidad y API intuitiva. Soporta C++11 y superior, no requiere dependencias externas y se distribuye como un único archivo de cabecera json.hpp.
Instalación
Descargue el archivo json.hpp desde el repositorio de GitHub y colóquelo en la carpeta de su proyecto. Luego, inclúyalo en el código:
#include <iostream>#include <fstream>#include "json.hpp" // Inclusión de la biblioteca
using json = nlohmann::json;Parsing de JSON desde cadena y archivo
La biblioteca permite parsear JSON desde una cadena, archivo o flujo de entrada. Veamos un ejemplo de parsing desde una cadena:
#include <iostream>#include "json.hpp"
using json = nlohmann::json;
int main() { // Cadena JSON std::string jsonString = R"({ "name": "Alice", "age": 30, "isStudent": false, "hobbies": ["reading", "coding"] })"; // Parsing json data = json::parse(jsonString); // Acceso a datos std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "Is student: " << (data["isStudent"] ? "true" : "false") << std::endl; // Iteración sobre el array for (auto& hobby : data["hobbies"]) { std::cout << "Hobby: " << hobby << std::endl; } return 0;}Para parsear desde un archivo, use json::parse(std::ifstream("data.json"));.
Serialización JSON
La creación de un objeto JSON y su serialización a cadena se realiza de forma natural:
#include <iostream>#include "json.hpp"
using json = nlohmann::json;
int main() { json person; person["name"] = "Bob"; person["age"] = 25; person["isStudent"] = true; person["hobbies"] = {"gaming", "swimming"}; // Objeto anidado json address; address["city"] = "Moscow"; address["street"] = "Tverskaya"; person["address"] = address; // Serialización a cadena con sangría std::string serialized = person.dump(4); // 4 espacios para formateo std::cout << serialized << std::endl; // Guardar en archivo std::ofstream file("output.json"); file << person.dump(2); file.close(); return 0;}El método dump() convierte el objeto en una cadena. El parámetro indica la cantidad de espacios para la sangría (0 — salida compacta).
Biblioteca Boost.PropertyTree: enfoque alternativo
Si en su proyecto ya se usa Boost, la biblioteca Boost.PropertyTree proporciona una forma conveniente de trabajar con JSON y otros formatos (XML, INI). Está menos especializada para JSON, pero se integra bien con el ecosistema de Boost.
Parsing de JSON con Boost.PropertyTree
#include <iostream>#include <boost/property_tree/ptree.hpp>\