Bases do Serde
9 exemplos para você começar com o Serde - 6 básicos e 3 intermediários.
Pré-requisitos
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"- Serde 1.0 é o framework de serialização de fato para Rust.
- Adicione crates de formato (
serde_json,toml, etc.) por formato de fio.
Exemplos Básicos
1. Derive Serialize
Transforma um struct em JSON.
use serde::Serialize;
#[derive(Serialize)]
struct User { id: u64, name: String }
let u = User { id: 1, name: "Ada".into() };
let json = serde_json::to_string(&u).unwrap();#[derive(Serialize)]gera a implementação do trait.- Nomes de campos se tornam chaves JSON por padrão.
to_stringaloca;to_vecpara bytes.
Relacionado: JSON com serde_json - parsing e
Value
2. Derive Deserialize
Analisa JSON em um struct.
use serde::Deserialize;
#[derive(Deserialize)]
struct Point { x: i32, y: i32 }
let p: Point = serde_json::from_str(r#"{"x":1,"y":2}"#).unwrap();- Campos ausentes geram erro, a menos que marcados como
Optionoudefault. - Incompatibilidades de tipo retornam erros descritivos do Serde.
- Prefira
Stringpossuída para entrada não confiável.
3. Ambos os Traits
Tipos de ida e volta precisam de ambos os derives.
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct Config { debug: bool }- Adicione
Debugpara asserções de teste. Cloneao armazenar configurações em estado.
4. Vec e Coleções
Serializa listas e mapas.
#[derive(Serialize)]
struct Batch { items: Vec<String> }
let json = serde_json::to_string(&Batch { items: vec!["a".into()] }).unwrap();Vec,HashMap,BTreeMapfuncionam imediatamente.- Coleções vazias serializam como
[]ou{}.
5. Campos Option
Chaves JSON opcionais mapeiam para Option.
#[derive(Deserialize)]
struct Profile { bio: Option<String> }- Chave ausente desserializa para
None. nullem JSON também mapeia paraNoneparaOption<T>.
6. Variantes Unit de Enum
Enums simples com tag.
#[derive(Serialize, Deserialize)]
enum Status { Active, Inactive }- A codificação padrão de enum é externamente tagged.
- Veja Enums & Tagging para outras formas.
Relacionado: Enums & Tagging - opções de representação
Exemplos Intermediários
7. #[serde(rename)]
Corresponde ao camelCase de APIs externas.
#[derive(Deserialize)]
struct ApiUser {
#[serde(rename = "userId")]
id: u64,
}- Renomeia campos individuais sem alterar os nomes Rust.
rename_all = "camelCase"na struct para todos os campos.
Relacionado: Personalizando a Serialização - mais atributos
8. #[serde(default)]
Preenche campos ausentes com padrões.
#[derive(Deserialize)]
struct Settings {
#[serde(default)]
retries: u32,
}- Usa
Default::default()para o tipo do campo. - Comum para evolução de API compatível com versões futuras.
9. Tipos Genéricos
Serde suporta genéricos com bounds.
#[derive(Serialize, Deserialize)]
struct Page<T> { items: Vec<T> }
#[derive(Serialize, Deserialize)]
struct Item { id: u64 }Tdeve implementarSerialize/Deserialize.- Funciona com
Vec<T>,Option<T>, genéricos aninhados.
Relacionado: Serialização (De) Personalizada - implementações manuais
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.