Pular para o conteúdo

JSON para structs Rust

JSON to Rust Structs

Gera structs Rust anotadas com serde a partir de um exemplo de JSON, com Option para campos nulos ou ausentes e renomeações em snake_case.

Emite structs de Rust com derives de `serde` a partir de um documento JSON de exemplo: `Serialize`, `Deserialize`, o `Option<…>` certo nos campos que às vezes faltavam, e um `#[serde(rename = "…")]` onde quer que a chave JSON não seja um nome de campo snake_case válido.

🔒 Roda inteiramente no seu navegadorrustjsoncodegenserde
Gerar

JSON de exemplo

Solte um arquivo .json

Lido nesta aba. Nada é enviado.

Dê todos os elementos que você tiver. Cada registro a mais estreita o palpite: um campo que falta em um deles é o que o torna opcional.

Rust

Como usar

  1. Cole todos os registros que você tiver

    Cada elemento de cada array é lido e mesclado, não só o primeiro. Três registros dizem muito mais do que um, porque um campo ausente em um deles é exatamente o que torna esse campo opcional.

  2. Dê nome ao tipo raiz

    Objetos aninhados recebem o nome da chave que os contém, no singular para arrays, então `users` produz um `User`. Só a raiz precisa de um nome seu.

  3. Leia as contagens abaixo da saída

    Tipos, campos opcionais, uniões e quantos registros foram mesclados. Uma contagem de uniões acima de zero significa que um campo teve dois tipos de valor diferentes na sua amostra — vale olhar antes de colar o resultado em uma base de código.

  4. Cole as structs no seu crate

    A linha `use serde::{Deserialize, Serialize};` é emitida para você; o crate em si e sua feature `derive` cabem a você adicionar ao Cargo.toml.

Perguntas frequentes

Por que um campo saiu como `serde_json::Value`?

Porque ele continha mais de um tipo de valor na amostra: uma string em um registro e um número em outro. Rust não tem uma união sem tag para recorrer aqui, e `Value` é o tipo honesto: desserializa sem mentir sobre o que há dentro.

Qual é a diferença entre `Option<T>` e `#[serde(default)]` aqui?

Um campo que era `null` em alguns registros vira `Option<T>`; um campo que simplesmente estava ausente recebe também `#[serde(default)]`, para que desserializar um registro sem ele dê certo em vez de dar erro. Os dois aparecem juntos quando a amostra mostrou as duas coisas.

Enums são gerados para campos de string?

Não. Toda string é `String`. Inferir um enum de um punhado de registros significa um erro de desserialização na primeira vez que a produção mandar uma variante que a sua amostra não continha, o que é uma falha pior do que um tipo frouxo.

Posso derivar outros traits?

Adicione você mesmo: a lista de derives emitida é deliberadamente só `Serialize, Deserialize`. `Debug` e `Clone` quase sempre são desejados também, mas são uma edição de uma linha, e adivinhar errado faz a saída não compilar para tipos que não podem derivá-los.

Pode receber de

Em seguida

Estas aceitam o que esta ferramenta produz, então o resultado pode ir direto.