Conversor de Rust a JSON
Pega structs de Rust con derive Serialize. Obtén JSON limpio al instante.
Qué hace esta herramienta
Si alguna vez has definido un struct, le has puesto #[derive(Serialize)] encima y te has dado cuenta de que solo necesitas el JSON sin escribir el boilerplate de serde, añadir serde_json al Cargo.toml y ejecutar cargo run — esta herramienta hace precisamente eso. Pega el Rust aquí y recibe JSON válido sin tocar cargo. Maneja un único struct, un módulo entero con varios tipos, o algo con Vec y Option profundamente anidados — mismo resultado: un documento JSON limpio con cada campo preservado.
El conversor sigue cómo serializa serde realmente los valores. String y &str se convierten en strings JSON. i32, u64, f32, f64 pasan a ser números JSON. bool pasa a true/false. Vec<T>, &[T] y [T; N] se convierten en arrays JSON. HashMap<String, V> / BTreeMap<String, V> pasan a ser objetos JSON. Option<T> con None se convierte en null JSON; con Some(value) serializa el tipo interno. Las tuplas salen como arrays heterogéneos — el comportamiento exacto documentado en serde.rs/data-model.
Los atributos de serde se respetan. #[serde(rename = "x")] renombra la clave JSON, #[serde(skip)] elimina el campo y #[serde(flatten)] sube los campos del struct anidado al objeto padre. Los tipos enum siguen la representación externally-tagged por defecto (configurable con #[serde(tag = "type")]). Pega varios structs de golpe y cada uno sale como entrada de nivel superior. Si trabajas con servicios web construidos sobre la librería estándar de Rust más axum/actix, esta salida encaja directamente en tus tests de integración.
Cómo usarla
Tres pasos. Funciona igual tanto si pegas un único struct como un módulo completo con una docena de tipos.
Pega tu Rust (o carga el ejemplo)
Coloca tu Rust en el editor de la izquierda tal cual. Un struct, un tuple struct, un enum con variantes, varios tipos o Vec/Option/HashMap anidados — todo vale. Pulsa Cargar ejemplo para ver un caso realista primero.
No hace falta quitar las sentencias use, los lifetimes ni los derive. Deja la sintaxis de Rust tal cual — los atributos serde forman parte de lo que lee el parser.
Pulsa Convertir
Haz clic en el botón verde Convertir. La herramienta lee el Rust, preserva cada struct y cada campo, y emite el JSON de una pasada. Aparece un pequeño indicador de carga mientras trabaja.
Copia el JSON
El panel de la derecha se llena con JSON indentado. Cópialo a un test con reqwest, a un test de integración de axum, a tus ejemplos de OpenAPI o a un comando curl. Sin recompilar.
Cuándo viene realmente bien
Fixtures para servicios web
Tienes un struct de petición de axum o actix y necesitas el JSON para un test o una llamada con curl. Pegas el struct, coges el JSON y sigues — sin ciclo de cargo.
Plantillas de config para CLIs
Una CLI con clap y un struct Config. Conviértelo a una plantilla JSON que los usuarios puedan editar, sin escribir una impl <code>Default</code> a medida solo para la documentación.
Semillas para tests de integración
Convierte los structs de tus tests unitarios en ficheros JSON de seed para tests de integración, mock servers o fixtures de bases de datos embebidas.
Documentación que no se desfasa
Genera ejemplos JSON para tu README o tu spec OpenAPI directamente desde los tipos Rust reales, así la documentación deja de desincronizarse.
Preguntas frecuentes
¿Necesito serde y serde_json en mi Cargo.toml?
No para esta herramienta — corre en el servidor y no compila tu código. Para usarla en runtime dentro de tu app, serde con la feature derive más serde_json es la combinación estándar.
¿Respeta #[serde(rename)], #[serde(skip)] y #[serde(flatten)]?
Sí. #[serde(rename = "x")] renombra la clave JSON, #[serde(skip)] quita el campo de la salida y #[serde(flatten)] sube los campos del struct anidado al padre — tal y como describe la documentación de atributos de campo de serde.
¿Cómo se tratan Option, Vec y HashMap?
Option<T> con None pasa a null JSON; con Some(v) serializa el valor interno. Vec<T>, slices y arrays pasan a arrays JSON. HashMap<String, V> y BTreeMap<String, V> pasan a objetos JSON; los mapas con claves no-string ven sus claves convertidas a string.
¿Y los enums con variantes?
Por defecto, las variantes de enum usan la representación externally-tagged ({ "VariantName": {...} }). Los atributos #[serde(tag = "type")], #[serde(untagged)] y #[serde(content = "data")] cambian a internally-tagged, untagged o adjacently-tagged — la herramienta lee esos atributos y emite la salida acorde.
¿Se guarda mi código?
Tu código se envía al backend para la conversión y no se persiste — no registramos el payload. Revisa el código sensible antes de pegarlo.
¿Qué pasa si el Rust usa lifetimes o genéricos?
Los lifetimes (&'a str) se ignoran — JSON no los conoce. Los genéricos instanciados a tipos concretos (Vec<User>) funcionan. Los genéricos sin instanciar salen como null. Las macros que se expanden a sintaxis real funcionan; las que dependen de un proc-macro crate no visible aquí se tratan como opacas.
Otras herramientas que te pueden venir bien
Rust a JSON es una pieza del puzle. Estas encajan bien: