Converter JSON em estruturas Rust Serde — Numio
Gera structs Rust com os derives Serialize e Deserialize do serde a partir de uma amostra JSON. Os campos viram snake_case com um atributo rename_all, as chaves ausentes em alguns itens de um array viram Option<T> e os valores null viram serde_json::Value.
Tipar a resposta de uma API de terceiros antes de desserializá-la com serde_json em um cliente reqwest.
JSON
Rust Serde
Quando usar
- Tipar a resposta de uma API de terceiros antes de desserializá-la com serde_json em um cliente reqwest.
- Escrever structs para um arquivo de configuração ou fixture JSON em uma CLI Rust ou um serviço Axum.
Como usar
- Cole a amostra JSON; se um campo for opcional, inclua itens de array com e sem ele.
- Abra as configurações e escolha Property Name Format de acordo com as chaves do seu JSON (padrão camelCase). Isso define #[serde(rename_all = ...)]; as chaves que não se encaixam recebem #[serde(rename = ...)].
- Copie o código e adicione serde (com derive), serde_derive e serde_json ao Cargo.toml, como as linhas use geradas esperam.
Entrada JSON
{
"orderId": "A-1001",
"total": 19.5,
"paid": true,
"coupon": null,
"items": [
{ "sku": "PEN-01", "qty": 2 },
{ "sku": "BOOK-7", "qty": 1, "giftWrap": true }
]
}Structs Rust (serde)
use serde_derive::Deserialize;
use serde_derive::Serialize;
use serde_json::Value;
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Root {
pub order_id: String,
pub total: f64,
pub paid: bool,
pub coupon: Value,
pub items: Vec<Item>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Item {
pub sku: String,
pub qty: i64,
pub gift_wrap: Option<bool>,
}Detalhes e limitações
A geração roda no navegador com o módulo WebAssembly json_typegen; nada é enviado a um servidor.
Inteiros viram i64 e decimais f64. null e arrays vazios geram serde_json::Value e Vec<Value>; substitua-os por tipos concretos como Option<String>.
Palavras-chave do Rust são renomeadas: uma chave chamada type vira type_field com #[serde(rename = "type")].
Toda struct deriva Default, Debug, Clone e PartialEq, além de Serialize e Deserialize; remova os que não forem necessários.
FAQ
O que a configuração Property Name Format muda?
Ela descreve como as chaves do seu JSON estão escritas, não os nomes dos campos Rust. Os campos são sempre snake_case; a configuração escolhe o valor de rename_all para que o serde os mapeie de volta para camelCase, kebab-case, PascalCase etc.
Como os campos opcionais são detectados?
Quando objetos do mesmo array têm chaves diferentes, as chaves ausentes em alguns itens viram Option<T>. Um campo presente em todos os itens da amostra não é opcional, mesmo que sua API às vezes o omita.
A raiz do JSON pode ser um array?
Sim. Um array na raiz gera pub type Root = Vec<Root2>; com uma struct Root2 para os itens.