Conversor de F# a JSON
Pega records o uniones de F#. Recibe JSON limpio de vuelta.
Qué hace esta herramienta
Si tienes un record o una unión discriminada de F# y necesitas un payload JSON para un test, una llamada HTTP o una integración con .NET, escribir el body a mano es un fastidio. Pega el F# aquí y recuperas JSON válido. Un record, una unión con unos cuantos casos, o un módulo entero — mismo flujo.
El conversor sigue el comportamiento de las librerías JSON que la mayoría del código F# usa. System.Text.Json con el converter de F#, Newtonsoft.Json y Thoth.Json convierten los campos del record en claves JSON — eso es justo lo que pasa aquí. int, float, decimal y bigint se vuelven números JSON. bool sigue siendo booleano. DateTime y DateTimeOffset salen como strings ISO-8601. string option emite el valor cuando es Some x o null cuando es None.
Las uniones discriminadas se serializan con un discriminador para que el JSON haga round-trip limpio. Un type Status = | Paid | Refunded of Guid sale como {"Case":"Refunded","Fields":["..."]} o con una forma etiquetada personalizada cuando hay atributos JsonUnionCase — igual que producen los serializadores del equipo dotnet/fsharp. Las listas, arrays y secuencias se vuelven arrays JSON. Map<string, 'T> se vuelve un objeto JSON. Las tuplas se vuelven arrays JSON. Si prefieres profundizar en el modelado idiomático de F#, vale la pena marcar fsharpforfunandprofit.com.
Cómo usarlo
Tres pasos. Funciona igual si pegas un solo record o un Domain.fs entero.
Pega tu F# (o prueba el ejemplo)
Suelta tu F# tal cual en el editor de la izquierda. Un record, una unión discriminada, una instancia de record usando la sintaxis { ... } o varios tipos — todo vale. Pulsa Cargar ejemplo para ver un caso realista.
Mantén las declaraciones module, namespace, open y los atributos — el parser ignora lo que no necesita. La referencia oficial del lenguaje F# es un buen respaldo.
Pulsa Convertir
Haz clic en el botón verde Convertir. La herramienta lee el F#, recorre cada campo de record y cada caso de unión, y produce el JSON en una sola pasada. Aparece un pequeño indicador de carga mientras corre.
Copia el JSON
El panel derecho se llena con JSON indentado. Pégalo en una petición de Giraffe o Saturn, en un fixture de xUnit, en un test de Fable, o en la documentación de tu API.
Cuándo viene bien de verdad
Fixtures de tests para Giraffe / Saturn
Necesitas un body JSON para hacer POST a un endpoint de Giraffe en un test. Pega el record del comando, obtén el payload y mételo en el spec.
Mocks para front-end con Fable
Convierte tus records de dominio F# en respuestas JSON simuladas para un front-end Fable o Elmish — se acabaron los objetos JS a mano que se desincronizan de los tipos.
Payloads para Azure Functions
Genera el body JSON que necesitas para llamar a una Azure Function escrita en F# — muy útil cuando estás iterando sobre la forma del input.
Docs que cuadran con tus tipos
Produce ejemplos JSON para la documentación de la API o un README directamente desde tus records reales, para que los docs nunca se queden atrás.
Preguntas habituales
¿Cómo se serializan los tipos Option?
Some x se convierte en el valor x; None se convierte en null de JSON. Coincide con el comportamiento por defecto de Thoth.Json y del converter F# de System.Text.Json.
¿Qué aspecto tienen las uniones discriminadas en JSON?
Por defecto: {"Case":"CaseName","Fields":[...]} — el formato etiquetado que hace round-trip de vuelta a F#. Si el código usa atributos personalizados (JsonUnionCase o similares), el conversor los respeta y emite la forma a medida.
¿Cómo maneja DateTime, DateTimeOffset y Guid?
DateTime y DateTimeOffset salen como strings ISO-8601. Guid es un string hex estándar 8-4-4-4-12. Coincide con lo que te da System.Text.Json de serie.
Listas, arrays, maps — ¿cómo se mapean?
list, array y seq se vuelven arrays JSON. Map<string, 'T> se vuelve un objeto JSON. Las tuplas se vuelven arrays JSON con tipos mixtos, igual que producen los serializadores de .NET.
¿Puedo pegar un módulo entero?
Sí. Cada record y unión de nivel superior se convierte en su propia entrada JSON, con los records anidados expandidos. Los let-bindings que construyen valores de ejemplo también se recogen — útil cuando tienes un módulo de datos de prueba.
¿Guardáis mi código?
Tu F# se envía al backend para la conversión y no se persiste — no registramos el payload. Para código de dominio sensible, revísalo antes de pegarlo.
Otras herramientas que te pueden venir bien
F# a JSON es una pieza. Estas combinan bien con ella: