Skip to content

Convertidor de JSON a struct de Rust

Pega JSON y obtén structs serde de Rust idiomáticos al instante, 100% en tu navegador. Tipado correcto i64/u64/f64, Option para null, #[serde(rename)] para camelCase. Gratis.

Sin rastreo Se ejecuta en el navegador Gratis
Opciones
0 caracteres
Salida Rust
0 líneas
Salida verificada frente a la semántica de serde y el formateo de rustfmt en payloads de API reales. — Go Tools Team · Jul 2, 2026

¿Qué es la conversión de JSON a Rust?

La conversión de JSON a Rust transforma una muestra JSON en structs de Rust listos para compilar con las macros #[derive(Serialize, Deserialize)] de serde, para que nunca escribas a mano el código repetitivo de deserialización de respuestas de API o archivos de configuración. Este generador rápido de structs de Rust infiere los tipos numéricos correctos, marca los campos ausentes como Option y añade #[serde(rename)] para las claves que no están en snake_case — todo al 100% en tu navegador.

Ejemplos

Respuesta de API

{"id":101,"name":"Ada Lovelace","email":"ada@example.com","active":true,"roles":["admin","user"]}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub id: i64,
    pub name: String,
    pub email: String,
    pub active: bool,
    pub roles: Vec<String>,
}

Un payload REST típico se convierte en un struct listo para serde que puedes integrar en tu cliente. Los números se infieren como i64, los arrays se convierten en Vec<String>.

Objeto anidado

{"repo":"serde","owner":{"login":"dtolnay","id":100}}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub repo: String,
    pub owner: Owner,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Owner {
    pub login: String,
    pub id: i64,
}

Los objetos anidados se convierten en structs separados y con nombre (Owner) referenciados por campo — las formas idénticas se deduplican.

Array de objetos (campo opcional)

{"users":[{"id":1,"nick":"x"},{"id":2}]}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub users: Vec<User>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
    pub id: i64,
    pub nick: Option<String>,
}

Los arrays de objetos se fusionan en un único struct de elemento. Las claves ausentes en algunos elementos se convierten en Option<String> — sin necesidad de #[serde(default)].

Claves en camelCase

{"login":"octocat","publicRepos":15,"followerCount":9001,"createdAt":"2011-01-25"}
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
    pub login: String,
    #[serde(rename = "publicRepos")]
    pub public_repos: i64,
    #[serde(rename = "followerCount")]
    pub follower_count: i64,
    #[serde(rename = "createdAt")]
    pub created_at: String,
}

Los campos se convierten en snake_case con #[serde(rename)] que remite a la clave JSON original. Las claves que ya están en snake_case como login no reciben rename.

Cómo convertir JSON a Rust

  1. 1

    Pega tu JSON

    Suelta un objeto JSON, un array o una respuesta de API en el campo de entrada. La conversión empieza al instante.

  2. 2

    Ajusta la salida

    Renombra el struct raíz y activa las derivaciones de serde, Debug y Clone, o la visibilidad pub para adaptarlo al estilo de tu crate.

  3. 3

    Copia o descarga

    Toma el Rust generado con un clic y pégalo directamente en tu proyecto.

Common Use Cases

Clientes de API tipados
Convierte una respuesta de ejemplo REST o GraphQL en structs de serde para un cliente reqwest o similar sin escribir a mano el código de deserialización.
Análisis de configuración y fixtures
Genera structs para archivos de configuración JSON, fixtures de prueba o payloads de webhooks que necesitas deserializar con serde_json.
Prototipado rápido
Pega un payload desconocido para ver al instante su forma como tipos de Rust — una forma rápida de explorar una nueva API antes de integrarla.

Cómo funciona la conversión

Inferencia estructural
Cada objeto se convierte en un struct con nombre; las formas idénticas se deduplican para que obtengas un solo struct, no copias. Los arrays de objetos se fusionan clave a clave, y las claves ausentes en algunos elementos se convierten en Option<T>.
Tipado numérico correcto
Los enteros se asignan a i64, ascienden a u64 más allá de i64::MAX, y recurren a f64 más allá de u64. Los flotantes se detectan a partir del token (1.0, 2e3) para que la deserialización de serde nunca falle por un flotante en un campo entero.
Identificadores idiomáticos y compilables
Las claves se convierten en campos snake_case con #[serde(rename)] de vuelta a la clave original; las palabras clave de Rust, los nombres duplicados y las claves que no son identificadores se sanean para que la salida siempre compile.
100% del lado del cliente
El análisis y la generación se ejecutan en tu navegador sin llamadas de red, por lo que tus datos siguen siendo privados.

Consejos para structs de Rust limpios

Nombra tu struct raíz
Define un nombre raíz significativo (p. ej. User, ApiResponse) en lugar del Root predeterminado para un código legible.
Añade serde_json solo cuando sea necesario
serde_json::Value aparece para arrays vacíos o de tipos mixtos y campos que solo son null. Da a esos campos un tipo concreto a partir de una muestra más rica si puedes, o añade serde_json a Cargo.toml.
Revisa Option frente a requerido
Los campos se marcan como Option<T> solo cuando una muestra los omite. Pega un payload representativo para que la herramienta infiera con precisión los campos requeridos y opcionales.

Preguntas frecuentes

¿Cómo convierto JSON a un struct de Rust?
Pega tu JSON en el campo de entrada. El conversor lo analiza al instante en tu navegador y genera a la derecha structs de Rust con las derivaciones de serde. Haz clic en Copiar para llevarte el resultado — sin subida, sin cuenta, sin esperas.
¿Genera derivaciones de serde? ¿Necesito serde y serde_json?
Sí — la salida usa #[derive(Debug, Clone, Serialize, Deserialize)] por defecto. Añade serde con la característica derive a tu Cargo.toml. Solo necesitas serde_json como dependencia si la salida contiene serde_json::Value, que aparece para arrays vacíos o mixtos y campos que solo son null. Desactiva la opción serde para emitir structs simples.
¿Cómo uso el struct generado para analizar JSON?
Añade serde_json a tu Cargo.toml y luego deserializa en una línea: let root: Root = serde_json::from_str(json)?;. La derivación Deserialize generada hace el resto — usa serde_json::from_slice para un slice de bytes o from_reader para un archivo o cuerpo HTTP, y serde_json::to_string para volver a serializar.
¿Cómo se gestionan los campos opcionales y null?
Cuando una clave aparece en algunos elementos del array pero no en otros, se convierte en un campo Option. Un campo que siempre es null se convierte en un serde_json::Value opcional. serde trata Option como opcional automáticamente, así que no se añade ni se requiere ningún atributo #[serde(default)].
¿Cómo gestiona las claves camelCase y las palabras clave de Rust?
Los nombres de campo se convierten a snake_case idiomático, y un atributo #[serde(rename)] los remite a la clave JSON exacta. Las palabras clave reservadas como type o match se emiten como type_ o match_ con un rename, lo que es más robusto que los identificadores en bruto porque también cubre self, crate y super.
¿Puede usar #[serde(rename_all)] en lugar de renombrados por campo?
La herramienta emite un #[serde(rename)] por campo porque siempre funciona — incluso cuando un payload mezcla camelCase, snake_case y claves irregulares. Si todos los campos de un struct comparten una misma convención, elimina esos atributos y coloca en su lugar un único #[serde(rename_all = "camelCase")] sobre el struct; ambos deserializan de forma idéntica.
¿Qué tipo numérico de Rust utiliza?
Los enteros se asignan a i64, o a u64 cuando un valor supera i64::MAX, y recurren a f64 más allá de u64 — así los identificadores grandes siguen siendo fieles. Cualquier número escrito con punto decimal o exponente (como 1.0 o 2e3) se asigna a f64, porque serde rechazaría un flotante en un campo entero.
¿Cómo se tipan las fechas y las marcas de tiempo?
JSON no tiene tipo de fecha, así que las cadenas ISO como 2011-01-25 o las marcas de tiempo RFC 3339 salen como String. Para un manejo real de fechas, cambia el campo a un tipo chrono — DateTime en la zona horaria Utc, o NaiveDate — y activa la característica serde de chrono. serde entonces analiza RFC 3339 automáticamente.
¿Cómo gestiono objetos con claves dinámicas o desconocidas?
Cuando las claves varían — por ejemplo un mapa de identificadores a valores — reemplaza el struct generado por un HashMap indexado por String. Para conservar un struct tipado y aun así capturar los campos adicionales, añade un campo #[serde(flatten)] que sea un HashMap. Para valores totalmente dinámicos, serde_json::Value es el tipo comodín.
¿Mis datos JSON son privados y seguros?
Sí. La conversión se ejecuta al 100% en tu navegador con JavaScript. Tu JSON — incluidos tokens, IDs o datos de clientes — nunca sale de la página y nunca se envía a un servidor.
¿Puedo generar structs de Rust simples sin serde?
Sí. Desactiva la opción serde para quitar la línea use serde, las derivaciones Serialize y Deserialize, y todos los atributos #[serde(rename)] — dejando structs limpios. También puedes activar o no las derivaciones Debug y Clone y la visibilidad pub.
¿La herramienta es gratis? ¿Necesito una cuenta?
Es completamente gratis, sin registro, sin límites y sin anuncios que saturen el espacio de trabajo.

Herramientas relacionadas

Ver todas las herramientas →