logo
GeekFormat

JSON a Rust

Herramienta online gratuita de JSON a Rust. Pega JSON de respuesta API para auto-generar structs con derive Serde, objetos anidados divididos independientemente, Vec y Option inteligentemente inferidos, conversión local pura en navegador, sin registro necesario.

Relacionado

Acerca de JSON a Rust: Convirtiendo datos JSON en structs Rust compilables

JSON a Rust es el proceso de convertir datos en formato JSON (objetos o arrays) en definiciones de tipo struct Rust. Rust es un lenguaje de programación de sistemas fuertemente tipado ampliamente usado para servicios backend, herramientas CLI, WebAssembly, embebidos y escenarios blockchain. En desarrollo a menudo necesitas convertir muestras JSON de documentación API o respuestas reales a tipos Rust; escribir structs a mano no solo es repetitivo sino propenso a errores de tipo de campo. Esta herramienta tiene como objetivo automatizar ese proceso para que los desarrolladores puedan enfocarse en lógica de negocio.

Esta herramienta se ejecuta localmente en el navegador basada en quicktype-core, usando opciones de renderizado just-types y no-comments para generar código struct limpio para Rust. La salida incluye use serde::{Serialize, Deserialize}; y el correspondiente #[derive(Serialize, Deserialize)], directamente utilizables con serde_json para deserialización. Esto significa que lo que obtienes no es solo un borrador de tipo, sino código Rust que puede colocarse en un proyecto Cargo y compilarse/ejecutarse con configuración mínima de dependencias.

La inferencia de tipos es el núcleo de JSON a Rust. La herramienta mapea tipos primitivos JSON a tipos estándar Rust: cadenas a String, enteros a i64, flotantes a f64, booleanos a bool, arrays a Vec<T>, objetos anidados a structs independientes, valores null a Option<serde_json::Value>. Para objetos anidados, la herramienta crea automáticamente nuevos structs para cada nivel, nombrados capitalizando primeras letras de campos, ej., un campo address genera un struct Address, objetos en arrays items generan un struct Item.

A diferencia de algunas herramientas online que requieren subir JSON a servidores para procesamiento, todos los cálculos para esta herramienta ocurren en tu navegador. quicktype-core se carga y ejecuta vía Web Worker; análisis JSON, inferencia de tipos, generación de código Rust y descargas de archivos ocurren todo localmente, sin datos enviados a ningún servidor. Esto es especialmente importante para JSON que contiene claves API, campos de privacidad de usuario o estructuras de negocio no publicadas; los datos se borran de memoria cuando cierras la página, haciéndolo una opción segura para deserialización JSON en intranet empresarial.

El código generado se usa típicamente en proyectos Cargo. Necesitas añadir dependencias serde = { version = "1", features = ["derive"] } y serde_json = "1" en Cargo.toml, copiar structs generados a archivos .rs en el directorio src, e importar vía declaraciones mod. Luego puedes usar serde_json::from_str::<User>(&json_string) para convertir respuestas API reales en structs fuertemente tipados, disfrutando comprobación de tipos en tiempo de compilación de Rust. Para frameworks web Rust populares como Actix-web, axum, Rocket, Warp, los structs generados pueden servir directamente como parámetros de manejador y modelos de respuesta.

Ten en cuenta que el código autogenerado es un punto de partida, no un punto final. La herramienta infiere tipos de muestras JSON y no puede determinar tipos de negocio precisos (ej., tipos semánticos como URL, Email, ID, timestamps son todos uniformemente inferidos como String o i64). Para campos JSON snake_case, los campos struct Rust se generan tal cual; puede que necesites añadir manualmente #[serde(rename = "user_name")] para mantener mapeo de deserialización, o cambiar String a tipos semánticos como chrono::DateTime<Utc>, uuid::Uuid, url::Url. Recomendamos usar resultados generados como primeros borradores, luego ajustar finamente nombres de campo, tipos y anotaciones según convenciones del proyecto.

Casos de uso

  • Integración REST API: Convierte respuestas JSON del backend a struct Rust, usa con reqwest + serde_json para análisis fuertemente tipado de cuerpo de petición HTTP y respuesta
  • Desarrollo backend Actix-web: Convierte JSON de ejemplo de parámetro API a struct Rust, compila y ejecuta directamente como parámetros web::Json<T> o modelos de respuesta
  • Desarrollo backend axum: Convierte JSON de parámetro de manejador axum a struct Rust, trabaja con extractor Json<T> para manejar cuerpos de petición POST
  • Definición de interfaz de microservicios: Convierte JSON de ejemplo de cuerpos de petición para servicios gRPC/HTTP a tipos Rust, unificando definiciones de modelo del lado del servidor compartidas entre equipos
  • Desarrollo de herramientas CLI: Convierte ejemplos JSON de archivos de configuración a struct Rust, usa con serde + clap para analizar argumentos de línea de comandos y configuración
  • Proyectos WebAssembly: Consumo fuertemente tipado de datos JSON pasados por JS frontend en lado Rust/WASM con structs generados, reduciendo errores de tipo en tiempo de ejecución
  • Aplicaciones de escritorio Tauri: Convierte JSON de payload de invoke frontend a struct Rust como tipo de parámetro #[tauri::command]
  • Análisis de datos de web scraping: Convierte datos JSON extraídos de páginas web a tipos Rust, evitando omisiones de campo causadas por acceso dinámico a serde_json::Value
  • Desarrollo de videojuegos: Convierte datos JSON de configuraciones de nivel y atributos de personaje a struct Rust, conveniente para que motores como Bevy lean recursos de configuración
  • IoT y embebidos: Convierte datos JSON de sensores reportados por dispositivos a tipos Rust para analizar y validar mensajes de dispositivos edge (requiere adaptación no_std)
  • Migración de base de datos: Convierte documentos JSON exportados de MongoDB/PostgreSQL a modelos Rust como referencia para definiciones de entidad Diesel/SQLx
  • Blockchain/Web3: Convierte respuestas JSON RPC en cadena a struct Rust para envoltura de tipos en SDKs solana-sdk/substrate
  • Construcción de datos de prueba: Convierte fixtures JSON reales devueltos por el backend a tipos Rust para aserciones estructuradas y pruebas golden en pruebas unitarias
  • Análisis estructurado de logs: Convierte logs JSON capturados por ELK/Loki/Vector a tipos Rust para fácil filtrado, reglas de alerta y extracción de campos
  • Migración de centro de configuración: Convierte configuraciones JSON Apollo/Nacos/Consul a tipos Rust para recarga en caliente de configuración del lado del servidor y validación
  • Colaboración entre lenguajes: Al integrar backend Rust con frontend TypeScript, convierte el mismo JSON a struct Rust e interfaz TS respectivamente para mantener ambos lados consistentes
  • Mantenimiento de SDK open source: Genera modelos Rust desde JSON de ejemplo de documentación API ascendente, publicando rápidamente SDKs de cliente Rust (publicación crates.io)
  • Ejemplos de enseñanza Rust: Convierte JSON de ejemplo a struct en cursos para enseñar proceso de deserialización Serde, propiedad y conceptos de lifetime
  • Conversión de nombres de campo: Después de convertir respuestas API JSON snake_case a structs Rust, añade manualmente #[serde(rename)] para mapeo de campos para mantener consistencia de estilo de nomenclatura

Cómo Usar

  1. Pega contenido JSON (objeto o array recomendado) en el editor izquierdo, o haz clic en el botón de subida para seleccionar un archivo .json/.txt; también puedes hacer clic en 'Sample' para cargar el ejemplo integrado
  2. Espera 400ms para auto-conversión; el código struct Rust generado (incluyendo use serde y #[derive(Serialize, Deserialize)]) aparecerá a la derecha
  3. Si el JSON está malformado, aparece un mensaje de error rojo a la derecha; haz clic en el botón 'Reparar JSON' para autoreparar problemas de sintaxis comunes (comas finales, comillas simples, comillas faltantes, etc.)
  4. Haz clic en el botón 'Copiar' para pegar el código Rust generado en el directorio src de tu proyecto Cargo, o haz clic en 'Descargar' para guardar como archivo .rs
  5. Añade dependencias serde = { version = "1", features = ["derive"] } y serde_json = "1" en Cargo.toml, luego ejecuta cargo build para verificar compilación
  6. (Opcional) Ajusta manualmente tipos de campo según necesidades del negocio (ej., i64→u32), añade #[serde(rename)] para mapeo snake_case/camelCase, completa tipos semánticos como chrono::DateTime

Características

  • Conversión local en navegador: Análisis JSON y generación de código Rust ocurren todo en el navegador vía Web Worker quicktype-core; datos de entrada nunca subidos a ningún servidor
  • Salida lista para Serde: Auto-genera use serde::{Serialize, Deserialize}; y #[derive(Serialize, Deserialize)], funciona directamente con serde_json para deserializar respuestas API reales
  • Inferencia de tipos inteligente: String→String, entero→i64, flotante→f64, bool→bool, array→Vec<T>, objeto anidado→struct independiente, null→Option<serde_json::Value>
  • Auto-división de objetos anidados: Objetos anidados generan structs independientes nombrados capitalizando primera letra del campo (address→Address), evitando definiciones de tipo duplicadas, soporta anidamiento de profundidad arbitraria
  • Manejo automático de Vec y Option: Arrays JSON se convierten uniformemente a Vec<T>, valores null se convierten uniformemente a Option<serde_json::Value>, reduciendo trabajo de escritura manual de tipos
  • Listo para Actix-web/axum/reqwest: Structs generados directamente utilizables para cuerpos de petición de manejadores Web, modelos de respuesta de cliente HTTP, estructuras de datos Tauri
  • Auto-conversión con debounce 400ms: Convierte al pegar, vista previa de código Rust en tiempo real a la derecha, evitando clics adicionales y retardo con JSON grande
  • Reparación de errores JSON con un clic: Repara automáticamente errores de formato comunes como comas finales, comillas simples, comillas faltantes, comentarios; continúa generando código después de reparación exitosa
  • Copiar y descargar: Un clic copia todo el código Rust al portapapeles, o descarga como archivo .rs directamente en el directorio src de tu proyecto Cargo
  • Historial localStorage: Guarda automáticamente entradas recientes localmente, reanudando edición rápidamente después de refrescar o cierre accidental de página
  • Paneles divididos responsivos: Edición JSON a la izquierda, código Rust a la derecha, soporta arrastrar para redimensionar anchos de panel, adaptado para pantallas grandes y móviles
  • Datos de ejemplo + subida de archivos: Ejemplo en chino integrado (con address/company/tags anidados), soporta arrastrar y soltar o clic para subir archivos .json/.txt

Ejemplos de Código

Rust: Manejador Actix-web recibiendo cuerpo de petición JSON

rust

Usa Actix-web 4.x con el struct generado como parámetro web::Json<T>; cuerpo de petición HTTP POST auto-deserializado.

// Cargo.toml
// [dependencies]
// actix-web = "4"
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"

use actix_web::{web, App, HttpServer, HttpResponse, Responder};
use serde::{Deserialize, Serialize};

// Auto-generated by this tool (from JSON)
#[derive(Serialize, Deserialize, Debug)]
pub struct CreateUserRequest {
    name: String,
    email: String,
    age: i64,
    tags: Vec<String>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct User {
    id: i64,
    name: String,
    email: String,
    age: i64,
    tags: Vec<String>,
}

// Actix-web handler: JSON input auto-deserialized
async fn create_user(payload: web::Json<CreateUserRequest>) -> impl Responder {
    let req = payload.into_inner();
    let user = User {
        id: 1,
        name: req.name,
        email: req.email,
        age: req.age,
        tags: req.tags,
    };
    HttpResponse::Ok().json(user) // Response also serialized with serde_json
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .route("/users", web::post().to(create_user))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

/*
 * Client call:
 * curl -X POST http://127.0.0.1:8080/users \
 *   -H "Content-Type: application/json" \
 *   -d '{"name":"Alice","email":"a@b.com","age":30,"tags":["rust","actix"]}'
 */

Rust: Rutas axum + análisis de respuesta cliente reqwest

rust

Servidor axum usa extractor Json<T>, cliente reqwest usa .json::<T>() para deserializar respuestas; structs generados son bidireccionalmente compatibles.

// Cargo.toml
// [dependencies]
// axum = "0.7"
// tokio = { version = "1", features = ["full"] }
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"
// reqwest = { version = "0.12", features = ["json"] }

use axum::{routing::get, Json, Router};
use serde::{Deserialize, Serialize};

// Auto-generated by this tool
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Address {
    city: String,
    zip: String,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct User {
    id: i64,
    name: String,
    email: String,
    address: Address,
    tags: Vec<String>,
}

// axum handler: returns JSON response
async fn get_user() -> Json<User> {
    Json(User {
        id: 1,
        name: "Alice".into(),
        email: "a@b.com".into(),
        address: Address { city: "Beijing".into(), zip: "100000".into() },
        tags: vec!["rust".into(), "axum".into()],
    })
}

// reqwest client: deserialize remote API response
async fn fetch_user(url: &str) -> Result<User, reqwest::Error> {
    let user: User = reqwest::get(url).await?.json().await?;
    Ok(user)
}

#[tokio::main]
async fn main() {
    // Start axum service
    let app = Router::new().route("/user", get(get_user));
    let listener = tokio::net::TcpListener::bind("127.0.0.1:8080").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

/*
 * After build, visit:
 * curl http://127.0.0.1:8080/user
 * {"id":1,"name":"Alice","email":"a@b.com",
 *  "address":{"city":"Beijing","zip":"100000"},
 *  "tags":["rust","axum"]}
 */

Rust: Renombrado de campos snake_case + mapeo de tipos personalizado

rust

Cuando campos JSON son snake_case pero quieres campos Rust camelCase, usa #[serde(rename)] para mapeo explícito y reemplaza tipos semánticos con chrono::DateTime.

use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
pub struct Article {
    #[serde(rename = "article_id")]
    pub article_id: i64,

    #[serde(rename = "title")]
    pub title: String,

    // JSON: "2026-07-08T10:00:00Z" → chrono::DateTime<Utc>
    #[serde(rename = "created_at")]
    pub created_at: DateTime<Utc>,

    #[serde(rename = "view_count")]
    pub view_count: i64,

    // Missing fields use Default::default()
    #[serde(rename = "summary", default)]
    pub summary: Option<String>,

    #[serde(rename = "tags")]
    pub tags: Vec<String>,
}

fn main() -> Result<(), serde_json::Error> {
    let json = r#"{
        "article_id": 42,
        "title": "Hello Rust",
        "created_at": "2026-07-08T10:00:00Z",
        "view_count": 1024,
        "tags": ["rust", "serde"]
    }"#;

    let article: Article = serde_json::from_str(json)?;
    println!("{:?}", article);
    // Article { article_id: 42, title: "Hello Rust",
    //   created_at: 2026-07-08T10:00:00Z, view_count: 1024, ... }

    // Reverse serialization: Rust value → JSON string
    let s = serde_json::to_string(&article)?;
    println!("{}", s);
    Ok(())
}

/*
 * Cargo.toml dependencies:
 * serde = { version = "1", features = ["derive"] }
 * serde_json = "1"
 * chrono = { version = "0.4", features = ["serde"] }
 */

Rust: Comando Tauri 2.x recibiendo payload de invoke frontend

rust

Usa struct generado como tipo de parámetro #[tauri::command] de Tauri; invoke frontend auto-deserializa por JSON.

// Cargo.toml
// [dependencies]
// tauri = { version = "2", features = [] }
// serde = { version = "1", features = ["derive"] }
// serde_json = "1"

use serde::{Deserialize, Serialize};

// Auto-generated by this tool
#[derive(Serialize, Deserialize, Debug)]
pub struct CreateNoteRequest {
    pub title: String,
    pub content: String,
    pub tags: Vec<String>,
}

#[derive(Serialize, Deserialize, Debug)]
pub struct Note {
    pub id: i64,
    pub title: String,
    pub content: String,
    pub tags: Vec<String>,
    pub created_at: String, // can manually change to chrono::DateTime<Utc>
}

// Tauri command: called from frontend via invoke('create_note', payload)
#[tauri::command]
fn create_note(payload: CreateNoteRequest) -> Result<Note, String> {
    let note = Note {
        id: 1,
        title: payload.title,
        content: payload.content,
        tags: payload.tags,
        created_at: "2026-07-14T10:00:00Z".to_string(),
    };
    Ok(note)
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![create_note])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

/*
 * Frontend call example (TypeScript):
 *
 * import { invoke } from '@tauri-apps/api/core';
 * const note = await invoke<Note>('create_note', {
 *   payload: { title: 'Hello', content: 'World', tags: ['rust', 'tauri'] }
 * });
 */

Best Practices

La herramienta infiere como tipos básicos String/i64/f64 desde muestras JSON, pero en el negocio hay tipos semánticos más precisos como chrono::DateTime<Utc>, uuid::Uuid, url::Url, std::net::IpAddr, rust_decimal::Decimal. Recomendamos cambiar inmediatamente estos campos a tipos de negocio después de generación para que el sistema de tipos capture más errores.

No cambies el nombre del campo user_name generado a userName para adaptarlo a la convención de nomenclatura Rust, esto hará que la deserialización Serde falle. La práctica correcta es mantener el nombre de campo snake_case + #[serde(rename = "userName")], o añadir #[serde(rename_all = "camelCase")] en todo el struct.

Para compatibilidad hacia atrás con iteraciones de versión API (campos nuevos no harán que clientes antiguos fallen en deserialización), recomendamos añadir #[serde(default)] a todos los campos Option<T> o campos que permiten omisión. Así incluso si JSON falta el campo, puede usar Default::default() como respaldo, evitando fallo de deserialización de toda la petición.

Aunque la herramienta se ejecuta completamente localmente sin enviar ningún dato, antes de pegar recomendamos desensibilizar o eliminar campos sensibles como claves API, access_token, números de identificación de usuario para evitar residuos en memoria después de cierre accidental del navegador (aunque al cerrar página se borra). Esto es un buen hábito de higiene de seguridad.

Cuando el nivel de anidamiento JSON ≥ 3, la herramienta generará múltiples structs anidados. Recomendamos colocar el struct raíz en src/models/user.rs, structs anidados (como Address, Company) en subdirectorio src/models/, luego organizar vía declaraciones mod, facilitando mantenimiento de proyectos grandes.

El código generado por defecto cumple con las normas Rust, pero clippy puede sugerir algunas mejoras (como sugerir cambiar String a &str, cambiar i64 a usize, etc.). Ejecutar cargo clippy --all-targets -- -D warnings puede descubrir puntos potenciales de optimización de tipos.

El struct generado por esta herramienta por defecto usa String/Vec<T>, dependiendo de asignación de montículo de std. En entornos embebidos/no_std, necesitas reemplazar manualmente con &'static str, heapless::String, NVec<T, N> y otros tipos sin asignación de montículo, y asegurar que los tipos correspondientes implementan serde::Deserialize.

Cuando un solo JSON supera 5MB, el procesamiento WASM del navegador se ralentizará y el uso de memoria será alto. Recomendaciones: ① Divide JSON por módulos de negocio; ② Usa esta herramienta para convertir cada módulo respectivamente; ③ Recombina en el proyecto Cargo. Esto garantiza velocidad de conversión y también facilita mantenimiento de código.

Preguntas Frecuentes

¿Cómo convierto JSON a un struct Rust?

Pega contenido JSON en el editor izquierdo, o haz clic en el botón de subida para seleccionar un archivo .json/.txt. También puedes hacer clic en 'Sample' para cargar el ejemplo integrado. La herramienta llama automáticamente a quicktype-core en 400ms para generar código Rust, mostrando structs derivados de Serde a la derecha. Si el JSON está malformado, haz clic en el botón 'Reparar JSON' para autoreparar antes de convertir.

¿El código Rust generado incluye anotaciones serde?

Sí. La herramienta usa el modo de renderizado just-types de quicktype-core, generando use serde::{Serialize, Deserialize}; y #[derive(Serialize, Deserialize)] para Rust, directamente utilizables con serde_json para deserialización. Si no necesitas Serde, puedes eliminar manualmente el derive y las sentencias use.

¿Qué estructuras de datos JSON son soportadas?

Todas las estructuras JSON válidas son soportadas: tipos primitivos (null, boolean, number, string), arrays (1D o multidimensionales), objetos anidados (cualquier profundidad). Los objetos JSON generan un struct raíz; los arrays JSON generan un tipo raíz de Vec<T>. Valores no-JSON como literales de objeto JavaScript, funciones, Symbol, undefined no son soportados.

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

Cadenas se mapean a String, enteros a i64, flotantes a f64, booleanos a bool, arrays a Vec<T>, objetos anidados a struct independiente, null a Option<serde_json::Value>. Consulta la 'Tabla de referencia de mapeo de tipos JSON a tipos Rust' abajo para reglas de mapeo específicas.

¿Qué tipo generan los valores null?

Los valores null en JSON generan Option<serde_json::Value>, indicando que el campo puede faltar o tener un tipo incierto. Si ya conoces el tipo real del campo, puedes proporcionar un valor de ejemplo en el JSON fuente (ej., "field": "" infiere String), luego cámbialo a un tipo más preciso como Option<String>, Option<i64> después de la generación según necesidades del negocio.

¿Los arrays se convierten a Vec?

Sí. Los arrays JSON se convierten uniformemente a genéricos Rust Vec<T>, con tipos de elemento inferidos automáticamente desde el primer elemento del array. Por ejemplo, ["a","b"] genera Vec<String>, [1,2,3] genera Vec<i64>, [{...},{...}] genera Vec<Item>. Arrays vacíos [] por defecto son Vec<serde_json::Value>, que pueden cambiarse manualmente a tipos específicos después de la generación según contexto.

¿Cómo se manejan los objetos anidados?

Cada objeto anidado genera un struct independiente, nombrado capitalizando la primera letra del nombre del campo. Por ejemplo, si el objeto raíz contiene un campo address, se generan ambos structs Root y Address, referenciados en Root vía address: Address. Objetos con la misma estructura reutilizan el mismo tipo para evitar definiciones duplicadas.

¿Puedo personalizar el nombre del struct generado?

quicktype-core por defecto usa el nombre de fuente JSON (como User) como nombre de struct raíz. Puedes modificar manualmente nombres de struct y ubicaciones de referencia después de la generación. El nombre de archivo .rs descargado también puede renombrarse según sea necesario al guardar. Si quieres que la herramienta auto-nombre por un campo específico, ajusta la clave de nivel superior JSON antes de pegar.

¿El código generado puede usarse directamente en un proyecto Cargo?

Sí, puede usarse directamente, pero asegura que el proyecto tenga dependencias serde y serde_json añadidas. En Cargo.toml añade serde = { version = "1", features = ["derive"] } y serde_json = "1", luego puedes usar serde_json::from_str::<User>(&json) o serde_json::from_reader(reader) para deserializar los structs generados.

¿Puede usarse para cuerpos de petición Actix-web/axum?

Sí. Ambos extractores JSON de Actix-web 4.x y axum 0.7+ están basados en serde_json; el struct generado sirve directamente como parámetro de manejador. Por ejemplo en axum: async fn create_user(Json(payload): Json<CreateUserRequest>) -> ...; en Actix-web: web::Json<CreateUserRequest>. No se necesitan anotaciones adicionales.

¿Puede usarse para deserialización de respuesta reqwest?

Sí. response.json::<T>() de reqwest internamente llama a serde_json; pasa el tipo de struct generado: let user: User = reqwest::get(url).await?.json().await?;. Si los campos API del backend son snake_case mientras los campos Rust son camelCase, añade manualmente #[serde(rename = "user_name")].

¿Soporta parámetros de comando Tauri?

Sí. Los parámetros de función de comando Tauri se deserializan vía serde; usa el struct generado como tipo de parámetro: #[tauri::command] fn create_user(payload: CreateUserRequest) -> Result<User, String>. Cuando el JS del frontend llama a invoke('create_user', payload), payload se serializa automáticamente a JSON luego se deserializa en el lado Rust.

¿Soporta tipos precisos como chrono::DateTime y uuid::Uuid?

La herramienta genera tipos básicos como String e i64 por defecto. Si necesitas tipos semánticos como chrono::DateTime<Utc>, uuid::Uuid, url::Url, std::net::IpAddr, ajusta manualmente tipos de campo después de la generación. Estos tipos todos implementan Deserialize de Serde; solo usa chrono::{DateTime, Utc}; y compilan.

¿Se suben los datos a servidores? ¿Es privado y seguro?

Se ejecuta completamente en tu navegador local. Análisis JSON, generación de código Rust y descargas de archivos ocurren todo en el navegador vía JavaScript y Web Worker quicktype-core; ni los datos JSON de entrada ni el código Rust generado se suben a ningún servidor, ni se registran o cachean en la nube. JSON sensible que contiene claves API, tokens o campos de negocio no publicados es seguro de usar; los datos se borran cuando cierras la página.

¿Necesito registrarme o iniciar sesión?

No. La herramienta es completamente gratuita, no requiere registro, inicio de sesión o autorización. Abre la página y úsala; todas las funciones están disponibles localmente en tu navegador.

¿Qué pasa si el formato JSON es incorrecto?

La herramienta detecta automáticamente la validez JSON; en caso de error, aparece un mensaje de error rojo a la derecha con un botón 'Reparar JSON'. Al hacer clic, repara automáticamente errores comunes: comas finales, comillas simples reemplazadas por comillas dobles, completado de comillas faltantes para claves, eliminación de comentarios, etc. Después de reparación exitosa, continúa generando código Rust.

¿Convertir JSON grande causará retardo?

No hay límite de líneas explícito, pero el análisis y renderizado de JSON extremadamente grande en el navegador se ralentizará. Recomendaciones: ① Divide JSON y convierte por lotes; ② Concéntrate en un nivel de anidamiento a la vez; ③ Si necesitas generar por lotes 100+ structs, usa la herramienta CLI quicktype (npm i -g quicktype) o plugins IDE.

¿Cuál es la diferencia entre esta herramienta y JSON a TypeScript?

Ambos convierten JSON a definiciones de tipo del lenguaje objetivo, pero las formas de salida difieren: JSON a Rust genera structs derivados de Serde, que son modelos de datos deserializables en tiempo de ejecución; JSON a TypeScript genera declaraciones interface/type, usadas solo para comprobación de tipos en tiempo de compilación. Elige según tu stack tecnológico y escenario de tiempo de ejecución.

¿El código generado puede usarse en entornos embebidos no_std?

Las definiciones de struct en sí mismas pueden ser no_std (dependiendo solo de core, no de std). Pero serde_json bajo no_std requiere usar serde_json::de::from_slice y habilitar las features apropiadas, y no puede usar String (necesita reemplazo con &str o heapless::String). En escenarios embebidos usualmente necesitas ajustar manualmente tipos de campo y asignadores.

¿Por qué los nombres de campo generados difieren de JSON?

La herramienta preserva nombres de campo JSON originales (incluyendo snake_case); los campos Rust por defecto siguen la convención de nomenclatura snake_case, por lo que al coincidir nombres JSON no ocurrirán inconsistencias. Si aparecen diferencias de nombre de campo, usualmente es porque el JSON fuente contiene caracteres especiales o claves duplicadas fueron fusionadas; recomendamos limpiar en una herramienta de reparación JSON antes de convertir.

Solución de problemas

Muestra "Por favor ingrese datos JSON" o el lado derecho está vacío

Muestra análisis JSON falló (Unexpected token)

Tipos de campo generados no son lo suficientemente precisos (quiero chrono::DateTime en lugar de String)

Campo null generó Option<serde_json::Value> en lugar de Option<String>

Error de compilación falta crate para serde/serde_json

Campos JSON snake_case no coinciden con estilo de nomenclatura Rust causando fallo de deserialización

Archivo .rs descargado da errores de compilación en proyecto

JSON muy grande (>5MB) conversión causa retardo de página o desbordamiento de memoria

actix-web/axum muestra el trait bound no se satisface

Parámetro de comando Tauri llamada frontend error tipo inválido

Glosario

struct
Palabra clave en Rust para definir tipos de datos compuestos. Esta herramienta genera structs, ej., pub struct User { id: i64, name: String }. Los campos son públicos por defecto (sin visibilidad son privados; serde derive requiere públicos).
Serde
El framework de serialización/deserialización más popular en el ecosistema Rust. El código generado por esta herramienta funciona con Serde vía #[derive(Serialize, Deserialize)], utilizable con serde_json, bincode, toml, postcard y otros formatos.
derive macro
Macro procedimental de Rust que implementa traits automáticamente para tipos. #[derive(Serialize, Deserialize)] generado por esta herramienta implementa automáticamente los traits de serialización y deserialización de Serde sin escribir bloques impl manualmente.
Vec<T>
Tipo de array dinámico en la biblioteca estándar Rust. Esta herramienta mapea automáticamente arrays JSON a Vec<T>, ej., arrays de cadenas se mapean a Vec<String>. Vec posee memoria asignada en el montículo, con lifetime gestionado automáticamente por el compilador Rust.
Option<T>
Tipo de valor opcional en la biblioteca estándar Rust indicando que un valor puede no existir. Esta herramienta mapea JSON null a Option<serde_json::Value>; también puedes cambiar manualmente a tipos más precisos como Option<String>, consumidos vía .unwrap() o coincidencia de patrones.
Cargo
Sistema de construcción y gestor de paquetes oficial de Rust. Al usar código generado por esta herramienta, necesitas declarar dependencias serde y serde_json en Cargo.toml y ejecutar cargo build/cargo run para compilar y ejecutar.
serde_json
Crate del framework Serde específicamente para procesamiento JSON. El uso típico es serde_json::from_str::<User>(&json_string) o serde_json::from_reader(reader) para convertir cadenas/fluxos de bytes JSON a structs Rust generados; es la dependencia subyacente para manejo JSON Actix-web/axum.
Serialize
Trait de serialización de Serde indicando que un tipo puede codificarse a formatos como JSON. Esta herramienta auto-genera implementaciones vía derive, utilizables para serde_json::to_string(&user) para convertir valores Rust de vuelta a cadenas JSON.
Deserialize
Trait de deserialización de Serde indicando que un tipo puede decodificarse desde formatos como JSON. Esta herramienta auto-genera implementaciones vía derive, usadas con serde_json::from_str; es el núcleo de deserialización de cuerpo de petición HTTP, archivos de configuración y payload de colas de mensajes.
Propiedad (Ownership)
Concepto central de gestión de memoria de Rust. Tipos como String y Vec<T> generados por esta herramienta poseen sus respectivos datos; después de deserialización, los lifetimes son gestionados automáticamente por el compilador Rust sin liberación manual, sin GC, sin sobrecarga en tiempo de ejecución.
#[serde(rename = "...")]
Atributo de renombrado de campo de Serde. Cuando nombres de campo JSON (como user_name) no coinciden con estilo de nomenclatura Rust, esta anotación le dice a Serde que coincida por nombre JSON original durante deserialización. Comúnmente usado para proyectos Rust camelCase que interactúan con APIs backend snake_case.
#[serde(default)]
Atributo de valor por defecto de campo de Serde. Cuando un campo falta en JSON, llama a Default::default() del tipo. Comúnmente usado para compatibilidad hacia atrás con campos recién añadidos en iteraciones de versión, evitando fallos de deserialización para JSON antiguo.
quicktype-core
Biblioteca de inferencia de tipos multi-lenguaje y generación de código usada internamente por esta herramienta, originalmente implementada en TypeScript, compilada a WebAssembly y ejecutándose en el navegador vía Web Worker, soportando 20+ lenguajes objetivo incluyendo Rust/TypeScript/Go/Python.
Web Worker
Mecanismo de hilo en segundo plano proporcionado por el navegador que permite a JavaScript ejecutar cálculos costosos en un hilo independiente sin bloquear el hilo principal. Esta herramienta usa Web Worker para cargar quicktype-core WASM, evitando congelación de página durante conversiones JSON grandes.
WebAssembly (WASM)
Formato de instrucciones binario que puede generarse desde compilación C/C++/Rust, ejecutable en navegadores a velocidad casi nativa. El motor central de esta herramienta quicktype-core está compilado a WASM y se ejecuta en el navegador.
chrono
La biblioteca de fecha/hora más popular en el ecosistema Rust, proporcionando tipos como DateTime<Utc>, NaiveDate; habilitar la feature serde permite análisis automático de cadenas de tiempo ISO 8601 con Serde. Comúnmente usada para reemplazar campos de tiempo String predeterminados generados por esta herramienta.
no_std
Un modo de compilación Rust que deshabilita la biblioteca estándar std, usando solo la biblioteca core, adecuado para escenarios con recursos limitados como embebidos, núcleos WebAssembly, sistemas operativos. serde también funciona bajo no_std (con features apropiadas habilitadas).
tokio
El runtime asíncrono más popular en el ecosistema Rust, dependido por bibliotecas mainstream como axum, reqwest, tonic. El código generado por esta herramienta se usa a menudo con la macro #[tokio::main] para iniciar el runtime en escenarios asíncronos.

Tabla de referencia de mapeo de tipos JSON a tipos Rust

La herramienta infiere automáticamente tipos Rust correspondientes basados en tipos de valor JSON:

Ejemplo Valor JSONTipo Rust GeneradoDescripción
nullOption<serde_json::Value>Tipo de valor null incierto; envuelve serde_json::Value con Option como respaldo
true / falseboolBooleanos JSON se mapean directamente a bool Rust
42i64Enteros JSON por defecto a i64 (cambia manualmente a u32/usize según sea necesario)
3.14f64Flotantes JSON por defecto a f64 (f64 recomendado para escenarios alta precisión)
"hello"StringCadenas JSON se mapean a String Rust (puede cambiarse manualmente a &str/chrono::DateTime/uuid::Uuid)
["a","b"]Vec<String>Arrays de cadenas se mapean a Vec<String>
[1,2,3]Vec<i64>Arrays de enteros se mapean a Vec<i64>
[{...},{...}]Vec<Item>Arrays de objetos generan struct correspondiente desde primer elemento, luego envuelto con Vec
[]Vec<serde_json::Value>Arrays vacíos no pueden inferir tipo de elemento; usa serde_json::Value como respaldo, recomienda cambio manual a tipo concreto después de generación
{...} objeto anidadostruct independienteObjetos anidados generan structs independientes, nombres de campo capitalizados (ej., address→Address)
{ "key": null }Option<serde_json::Value>Cuando valor de campo es null, por defecto infiere Option<serde_json::Value>; puede cambiarse manualmente a Option<String>

Explicación de estructura de código Rust generado

El código típico que quicktype-core genera para Rust incluye las siguientes partes:

Parte CódigoEjemploPropósito
use serde::{Serialize, Deserialize};use serde::{Serialize, Deserialize};Importar traits de serialización y deserialización de Serde
#[derive(Serialize, Deserialize)]#[derive(Serialize, Deserialize)]Hacer que el compilador auto-genere implementaciones de trait Serde
pub struct Userpub struct User { id: i64 }Definir struct público y campos
Campo Vec<T>scores: Vec<i64>Representa un campo de array JSON
Campo Option<T>label: Option<serde_json::Value>Representa un campo que puede ser null
Referencia a struct anidadoaddress: AddressRepresenta un objeto anidado; tipo autogenerado por la herramienta

Integración de frameworks Rust comunes con structs generados

Los structs generados pueden usarse directamente en los siguientes escenarios comunes del ecosistema Rust:

Framework / HerramientaEjemplo de UsoDependencias Requeridas
Actix-web 4.xweb::Json<User>actix-web = "4", serde_json = "1"
axum 0.7Json<User>axum = "0.7", serde_json = "1", tokio = "1"
Rocket 0.5Json<User>rocket = { version = "0.5", features = ["json"] }
warp 0.3body::json::<User>()warp = "0.3", serde_json = "1"
reqwest 0.12response.json::<User>().awaitreqwest = { version = "0.12", features = ["json"] }
Tauri 2.xfn command(payload: User)tauri = "2", serde = { version = "1", features = ["derive"] }
Bevy 0.14Serialización Resource / Componentbevy = "0.14", serde = { version = "1", features = ["derive"] }
SQLx 0.7Campos FromRow + serdesqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }

Referencia de atributos Serde comunes

Esta herramienta solo genera #[derive(Serialize, Deserialize)] por defecto, pero en proyectos reales a menudo se necesitan anotaciones de atributos adicionales para adaptarse a escenarios de negocio:

AtributoÁmbitoPropósito
#[serde(rename = "userName")]CampoCoincidir por nombre JSON original durante deserialización (snake_case ↔ camelCase)
#[serde(rename_all = "camelCase")]structMapear por lotes todos los campos a camelCase (afecta serialización y deserialización)
#[serde(default)]CampoUsar respaldo Default::default() cuando el campo falta en JSON
#[serde(skip_serializing_if = "Option::is_none")]CampoNo serializar el campo cuando es None (para limpiar salida JSON)
#[serde(skip)]CampoOmitir completamente el campo (no entra en JSON ni se deserializa desde JSON)
#[serde(flatten)]CampoAplanar campos de struct anidado al JSON externo (para campos dinámicos)
#[serde(deny_unknown_fields)]structFallar deserialización cuando JSON contiene campos no declarados (modo estricto)
#[serde(tag = "type")]enumDistinguir variantes enum por campo JSON (modo etiqueta interna)
#[serde(untagged)]enumInferir variante enum por contenido JSON (modo sin etiqueta)
#[serde(alias = "user_name")]CampoAñadir alias de deserialización adicionales para el campo (compatible con múltiples claves JSON)

Privacy & Security

Todas las operaciones de esta herramienta JSON a Rust ocurren completamente localmente en tu navegador: análisis JSON, generación de código Rust y descargas de archivos se ejecutan todas del lado del cliente a través del módulo WebAssembly quicktype-core; ningún contenido JSON, archivos subidos o código generado se envían por la red a ningún servidor. Las subidas de archivos usan la API nativa FileReader del navegador para leer directamente en memoria sin pasar por servicios intermedios. No se usa seguimiento de Cookies, no se recopilan datos de entrada o uso del usuario. Después de cerrar o refrescar la página, todo el contenido de entrada y salida se borra automáticamente de memoria. Adecuado para procesar JSON que contiene claves API, tokens, datos de privacidad de usuario, estructuras de negocio no publicadas y campos de interfaz internos.

Authoritative References