Generador de structs Rust desde JSON

Pega una respuesta de API en JSON y obtén structs de Rust listos para serde_json. Los campos van en snake_case, las claves distintas llevan #[serde(rename)] y los valores que pueden ser null o faltar pasan a Option<T>.

Funciona en tu navegador: nada de lo que escribes se envía a ningún sitio.

Cómo se usa

  1. Pega un ejemplo de JSON. Los arrays con varios objetos dan el mejor resultado.
  2. Elige si los structs y campos son pub y si se omiten los None al serializar.
  3. Copia el código a tu crate y analiza con let root: Root = serde_json::from_str(&text)?;.

Cómo funciona

El ejemplo se convierte en una «forma»: cada clave con todos los tipos que aparecen en ese lugar. Todos los objetos de un array se fusionan en un struct, así que una clave que solo está en algunos pasa a Option.

  • Cada struct deriva Debug, Clone, Serialize y Deserialize.
  • Los nombres de struct salen de las claves: items contiene Vec, customer pasa a Customer.
  • Un array de nivel superior da un alias de tipo, por ejemplo pub type Root = Vec;.

Ejemplo

{"items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} sin pub y con Omitir None da:

use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
struct Root {
    items: Vec<Item>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
struct Item {
    sku: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    note: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    qty: Option<i64>,
}

Consejos

  • Si todas las claves están en camelCase, puedes cambiar los rename de cada campo por un solo #[serde(rename_all = “camelCase”)] en el struct.
  • Ajusta los tipos cuando conozcas el rango: u32 para cantidades, u8 para códigos pequeños.
  • Añade #[serde(deny_unknown_fields)] si las claves de más deben dar error.

Preguntas frecuentes

¿Cómo se traducen los tipos de JSON a Rust?

Las cadenas pasan a String, true y false a bool, los enteros a i64 y los demás números a f64 (una mezcla da f64). Los arrays pasan a Vec<T>, los objetos a structs propios, y un lugar con valores de distinto tipo pasa a serde_json::Value.

¿Cuándo un campo es Option?

Cuando el ejemplo tiene null en ese lugar o la clave falta en algunos objetos de un array. El derive de serde lee un campo Option ausente como None, así que no hace falta #[serde(default)].

¿Qué hace Omitir None al serializar?

Añade #[serde(skip_serializing_if = "Option::is_none")] a cada campo Option: al serializar se omiten las claves cuyo valor es None en lugar de escribir null.

¿Qué pasa con claves como userId o type?

Los campos van en snake_case: userId pasa a user_id con #[serde(rename = "userId")]. Una palabra reservada de Rust, como type, recibe un guion bajo, type_, y un rename a la clave original.

¿Qué crates necesito?

serde con la feature derive y serde_json: en Cargo.toml, serde = { version = "1", features = ["derive"] } y serde_json = "1".

Más en Desarrollo

Todas las herramientas de la categoría: Desarrollo ·Actualizado el 4 de noviembre de 2026

Opciones de privacidad

Google Analytics nos muestra qué herramientas se usan y si funcionan. Puede usar cookies. Tu elección se guarda en este navegador.