Trabalho com JSON em C++: parsing e serialização na prática
JSON (JavaScript Object Notation) é um dos formatos de troca de dados mais populares em aplicações modernas. Apesar de C++ não ter suporte nativo a JSON, existem várias bibliotecas que facilitam o trabalho com este formato. Neste artigo, abordaremos os aspectos práticos de parsing e serialização de JSON em C++ usando a biblioteca nlohmann/json — uma das mais populares e fáceis de usar.
Por que escolher nlohmann/json?
A biblioteca nlohmann/json (frequentemente chamada de JSON for Modern C++) ganhou popularidade devido à sua API intuitiva, que lembra o trabalho com contêineres STL. Ela é header-only (não requer compilação), suporta C++11 e superior, além de oferecer alta performance e segurança de tipos.
A instalação da biblioteca é simples: basta baixar o arquivo de cabeçalho json.hpp ou usar um gerenciador de pacotes como vcpkg, Conan ou CMake FetchContent.
#include <nlohmann/json.hpp>using json = nlohmann::json;Fundamentos do parsing de JSON em C++
Parsing de JSON é o processo de converter uma string em dados estruturados. A biblioteca nlohmann/json oferece várias formas de fazer parsing.
Parsing a partir de uma string
A forma mais comum é usar o método estático json::parse():
#include <iostream>#include <string>#include <nlohmann/json.hpp>
int main() { std::string json_string = R"({ "name": "Ivan", "age": 30, "is_student": false, "skills": ["C++", "Python", "JavaScript"], "address": { "city": "Moscou", "zip": "101000" } })";
try { json data = json::parse(json_string); // Acesso aos dados std::cout << "Nome: " << data["name"] << std::endl; std::cout << "Idade: " << data["age"] << std::endl; std::cout << "Estudante: " << (data["is_student"] ? "sim" : "não") << std::endl; // Trabalhando com arrays for (auto& skill : data["skills"]) { std::cout << "Habilidade: " << skill << std::endl; } // Trabalhando com objetos aninhados std::cout << "Cidade: " << data["address"]["city"] << std::endl; } catch (json::parse_error& e) { std::cerr << "Erro de parsing: " << e.what() << std::endl; } return 0;}Parsing a partir de um arquivo
Para trabalhar com arquivos, use os fluxos de entrada e saída do C++:
#include <fstream>#include <nlohmann/json.hpp>
int main() { std::ifstream file("data.json"); if (!file.is_open()) { std::cerr << "Não foi possível abrir o arquivo" << std::endl; return 1; } try { json data = json::parse(file); std::cout << "Dados carregados: " << data.dump(2) << std::endl; } catch (json::parse_error& e) { std::cerr << "Erro: " << e.what() << std::endl; } return 0;}Serialização de JSON em C++
Serialização é o processo inverso: converter dados de C++ em uma string JSON. A biblioteca oferece o método dump() com opções de formatação.
Criando um objeto JSON
Você pode criar objetos JSON diretamente, como arrays associativos comuns:
#include <nlohmann/json.hpp>#include <iostream>
int main() { json person; person["name"] = "Maria"; person["age"] = 25; person["is_employed"] = true; person["languages"] = {"Português", "Inglês", "Alemão"};