Trabalhando com JSON em C++: parsing e serialização
JSON (JavaScript Object Notation) continua sendo um dos formatos mais populares para troca de dados em aplicações web, arquivos de configuração e APIs. Apesar de C++ não ter suporte nativo a JSON, existem várias bibliotecas poderosas que tornam o trabalho com este formato simples e eficiente. Neste artigo, vamos explorar as duas bibliotecas mais populares: nlohmann/json (recomendada para a maioria dos projetos) e RapidJSON (para tarefas onde a performance é crítica). Você aprenderá como fazer parsing de JSON, serializar objetos de volta para string e tratar erros.
Por que JSON em C++?
C++ é uma linguagem de programação de sistemas, mas aplicações modernas cada vez mais exigem interação com serviços web, armazenamento de configurações ou troca de dados entre microsserviços. JSON fornece um formato conveniente e legível para essas tarefas. O uso de bibliotecas para trabalhar com JSON em C++ permite:
- Carregar e processar arquivos de configuração (por exemplo, para engines de jogos ou servidores).
- Interagir com REST APIs (enviar e receber dados).
- Salvar e restaurar o estado de estruturas de dados complexas.
- Integrar-se com outras linguagens e sistemas que utilizam JSON.
Biblioteca nlohmann/json: simplicidade e praticidade
A biblioteca nlohmann/json (frequentemente chamada de "JSON for Modern C++") é, sem dúvida, a mais popular devido à sua API intuitiva, que lembra o trabalho com Python ou JavaScript. Ela suporta C++11 e versões superiores.
Instalação
A maneira mais simples é copiar o único arquivo de cabeçalho json.hpp para o seu projeto. Você pode baixá-lo do repositório oficial ou instalá-lo através de um gerenciador de pacotes (vcpkg, Conan).
Parsing de JSON a partir de uma string
Vamos ver um exemplo básico de parsing de uma string JSON e acesso aos dados:
#include <iostream>#include <nlohmann/json.hpp>using json = nlohmann::json;
int main() { // String JSON para parsing std::string json_string = R"({ "name": "C++", "version": 17, "features": ["RAII", "Templates", "Smart Pointers"], "is_compiled": true })";
// Parsing da string para um objeto json json data = json::parse(json_string);
// Acesso aos valores std::cout << "Linguagem: " << data["name"] << std::endl; std::cout << "Versão: " << data["version"] << std::endl; std::cout << "Compilada: " << data["is_compiled"] << std::endl;
// Acesso ao array for (auto& feature : data["features"]) { std::cout << " - " << feature << std::endl; } return 0;}Saída:
Linguagem: "C++"Versão: 17Compilada: true - "RAII" - "Templates" - "Smart Pointers"Serialização (criação de JSON)
Criar um objeto JSON e convertê-lo para string é igualmente simples:
#include <iostream>#include <nlohmann/json.hpp>using json = nlohmann::json;
int main() { // Criando um objeto JSON json person; person["name"] = "Alice"; person["age"] = 30; person["is_student"] = false; person["hobbies"] = {"reading", "coding", "chess"};
// Adicionando um objeto aninhado person["address"]["city"] = "Moscow"; person["address"]["zip"] = "101000";
// Serialização para string com indentação std::string serialized = person.dump(4); // 4 espaços para indentação std::cout << serialized << std::endl;
return 0;}O método dump(4) retorna uma string formatada de forma legível. Para uma saída compacta, use