Introdução ao trabalho com JSON em C++
JSON (JavaScript Object Notation) é um formato leve de troca de dados, amplamente utilizado em desenvolvimento web, arquivos de configuração e APIs. Apesar de C++ não ter suporte nativo a JSON, existem diversas bibliotecas confiáveis que simplificam o parsing (análise) e a serialização (conversão para string) dos dados. Neste artigo, veremos duas bibliotecas populares: nlohmann/json (recomendada para iniciantes e projetos modernos) e Boost.PropertyTree (para quem já utiliza Boost). Você aprenderá a ler, criar, modificar e exibir dados JSON em C++.
Biblioteca nlohmann/json: instalação e conceitos básicos
A biblioteca nlohmann/json (frequentemente chamada de "JSON for Modern C++") é uma das mais populares devido à sua simplicidade e API intuitiva. Ela suporta C++11 e superior, não requer dependências externas e é distribuída como um único arquivo de cabeçalho json.hpp.
Instalação
Baixe o arquivo json.hpp do repositório no GitHub e coloque-o na pasta do seu projeto. Em seguida, inclua-o no código:
#include <iostream>#include <fstream>#include "json.hpp" // Inclusão da biblioteca
using json = nlohmann::json;Parsing de JSON a partir de string e arquivo
A biblioteca permite fazer parsing de JSON a partir de string, arquivo ou fluxo de entrada. Veja um exemplo de parsing a partir de string:
#include <iostream>#include "json.hpp"
using json = nlohmann::json;
int main() { // String JSON std::string jsonString = R"({ "name": "Alice", "age": 30, "isStudent": false, "hobbies": ["reading", "coding"] })"; // Parsing json data = json::parse(jsonString); // Acesso aos dados std::cout << "Name: " << data["name"] << std::endl; std::cout << "Age: " << data["age"] << std::endl; std::cout << "Is student: " << (data["isStudent"] ? "true" : "false") << std::endl; // Iteração sobre o array for (auto& hobby : data["hobbies"]) { std::cout << "Hobby: " << hobby << std::endl; } return 0;}Para fazer parsing a partir de um arquivo, use json::parse(std::ifstream("data.json"));.
Serialização JSON
A criação de um objeto JSON e sua serialização em string é feita 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 aninhado json address; address["city"] = "Moscow"; address["street"] = "Tverskaya"; person["address"] = address; // Serialização em string com indentação std::string serialized = person.dump(4); // 4 espaços para formatação std::cout << serialized << std::endl; // Salvando em arquivo std::ofstream file("output.json"); file << person.dump(2); file.close(); return 0;}O método dump() converte o objeto em string. O parâmetro indica o número de espaços para indentação (0 — saída compacta).
Biblioteca Boost.PropertyTree: abordagem alternativa
Se o seu projeto já utiliza Boost, a biblioteca Boost.PropertyTree oferece uma maneira conveniente de trabalhar com JSON e outros formatos (XML, INI). Ela é menos especializada para JSON, mas se integra bem com o ecossistema Boost.
Parsing de JSON com Boost.PropertyTree
#include <iostream>#include <boost/property_tree/ptree.hpp>