Mapeamento Struct <-> JSON¶
Demonstra a serialização e desserialização bidirecional entre structs C++ e formato JSON sem alocações dinâmicas intermediárias.
Código-Fonte: examples/StructJson/StructJson.ino
Visão Geral¶
Utilizando a macro REST_JSON_MAP dentro da sua struct, você pode:
1. Enviar structs diretamente no corpo da requisição: client.post("/todos").body(newTodo);
2. Preencher structs diretamente a partir da resposta HTTP: client.get("/todos/1").getBody(&todo);
3. Converter de forma independente: ESP32HTTPClient::toJson(obj) e ESP32HTTPClient::fromJson(json, &obj).
Código Completo¶
#include <Arduino.h>
#include <WiFi.h>
#include "ESP32HTTPClient.h"
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
ESP32HTTPClient client("https://jsonplaceholder.typicode.com");
// Declaração da struct mapeada
struct Todo {
int id = 0;
int userId = 0;
char title[64] = {0};
bool completed = false;
REST_JSON_MAP(
REST_FIELD(id),
REST_FIELD(userId),
REST_FIELD(title),
REST_FIELD(completed)
)
};
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConectado ao WiFi");
}
void loop() {
Todo todo;
// 1. Obtendo JSON remoto diretamente para a struct
Serial.println("\n--- [1] Obtendo Todo como Struct ---");
client.get("/todos/1").getBody(&todo);
if (client.isSuccess()) {
Serial.printf("Struct Preenchida -> ID: %d, Usuário: %d, Título: %s, Concluído: %s\n",
todo.id, todo.userId, todo.title, todo.completed ? "true" : "false");
}
// 2. Enviando uma struct no corpo JSON da requisição
Serial.println("\n--- [2] Enviando Todo a partir de Struct ---");
Todo newTodo;
newTodo.userId = 1;
newTodo.id = 101;
strncpy(newTodo.title, "Construir dispositivo IoT incrível", sizeof(newTodo.title));
newTodo.completed = false;
Todo responseTodo;
client.post("/todos")
.body(newTodo)
.getBody(&responseTodo);
if (client.isSuccess()) {
Serial.printf("Struct Enviada -> ID do Recurso Criado: %d\n", responseTodo.id);
}
// 3. Conversão de JSON independente de requisição HTTP
Serial.println("\n--- [3] Conversão Struct para String JSON ---");
String jsonString = ESP32HTTPClient::toJson(newTodo);
Serial.printf("JSON Serializado: %s\n", jsonString.c_str());
delay(15000);
}
Saída Serial Esperada¶
Conectado ao WiFi
--- [1] Obtendo Todo como Struct ---
Struct Preenchida -> ID: 1, Usuário: 1, Título: delectus aut autem, Concluído: false
--- [2] Enviando Todo a partir de Struct ---
Struct Enviada -> ID do Recurso Criado: 101
--- [3] Conversão Struct para String JSON ---
JSON Serializado: {"id":101,"userId":1,"title":"Construir dispositivo IoT incrível","completed":false}
Pontos Importantes¶
- Campos ausentes no JSON mantêm os valores pré-existentes/padrão da struct.
- Valores
nullno JSON são tratados com segurança sem corromper memória. - Propriedades desconhecidas extras no JSON são automaticamente ignoradas.