Pular para o conteúdo

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

  1. Cole a amostra JSON; se um campo for opcional, inclua itens de array com e sem ele.
  2. 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 = ...)].
  3. 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.

Especificações e referências