Pega Rust a la izquierda y pulsa "Convertir" — lo transformamos en JSONPega código Rust

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.

1

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.

2

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.

3

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: