F# zu JSON Converter
F# Records oder Unions einfügen. Sauberes JSON zurückbekommen.
Was dieses Tool macht
Wenn du einen F#-Record oder eine Discriminated Union hast und einen JSON-Payload für einen Test, einen HTTP-Call oder eine .NET-Integration brauchst, ist das Body-Schreiben von Hand nervig. Paste den F#-Code hier rein und du bekommst gültiges JSON zurück. Ein Record, eine Union mit ein paar Cases, oder ein ganzes Modul — gleicher Flow.
Der Converter folgt dem Verhalten der JSON-Libraries, die der meiste F#-Code nutzt. System.Text.Json mit dem F#-Converter, Newtonsoft.Json und Thoth.Json machen aus Record-Feldern alle JSON-Keys — genau das passiert hier auch. int, float, decimal und bigint werden zu JSON-Zahlen. bool bleibt ein Boolean. DateTime und DateTimeOffset kommen als ISO-8601-Strings raus. string option gibt den Wert aus, wenn es Some x ist, oder null, wenn es None ist.
Discriminated Unions werden mit einem Diskriminator serialisiert, damit das JSON sauber hin und zurück mapt. Ein type Status = | Paid | Refunded of Guid kommt als {"Case":"Refunded","Fields":["..."]} raus, oder in einer eigenen Tag-Form, wenn JsonUnionCase-Attribute dabei sind — passend zu dem, was die Serializer vom dotnet/fsharp-Team produzieren. Lists, arrays und sequences werden JSON-Arrays. Map<string, 'T> wird ein JSON-Objekt. Tuples werden JSON-Arrays. Wenn du tiefer in idiomatisches F#-Modellieren einsteigen willst, lohnt sich ein Bookmark auf fsharpforfunandprofit.com.
So benutzt du es
Drei Schritte. Funktioniert gleich, egal ob du einen Record oder ein komplettes Domain.fs paste.
F# einfügen (oder das Beispiel probieren)
Paste dein F# wie es ist in den linken Editor. Ein Record, eine Discriminated Union, eine Record-Instanz mit { ... }-Syntax, oder mehrere Typen — alles okay. Klick auf Beispiel laden für einen realistischen Fall.
module, namespace, open und Attribut-Deklarationen kannst du drinlassen — der Parser ignoriert, was er nicht braucht. Die offizielle F#-Sprachreferenz ist ein guter Backup.
Auf Konvertieren klicken
Klick auf den grünen Konvertieren-Button. Das Tool liest das F#, läuft durch jedes Record-Feld und jeden Union-Case, und produziert in einem Durchgang JSON. Während es läuft, zeigt ein kurzer Loading-Indicator das an.
JSON kopieren
Das rechte Panel füllt sich mit eingerücktem JSON. Paste es in einen Giraffe- oder Saturn-Request, in ein xUnit-Fixture, einen Fable-Test, oder in deine API-Doku.
Wann das wirklich hilft
Giraffe / Saturn Test-Fixtures
Du brauchst einen JSON-Body, um im Test an einen Giraffe-Endpoint zu POSTen. Paste den Command-Record, hol dir den Payload, rein damit in den Spec.
Fable-Frontend-Mocks
Mach aus deinen F#-Domain-Records Mock-JSON-Responses für ein Fable- oder Elmish-Frontend — Schluss mit handgeklöppelten JS-Objekten, die von den Typen abdriften.
Azure-Functions-Payloads
Generiere den JSON-Body, den du brauchst, um eine in F# geschriebene Azure Function aufzurufen — praktisch, wenn du gerade am Input-Shape feilst.
Doku, die zu deinen Typen passt
Produziere JSON-Samples für API-Dokumentation oder ein README direkt aus deinen echten Records, damit die Doku nie hinterherhinkt.
Häufige Fragen
Wie werden Option-Typen serialisiert?
Some x wird zum Wert x; None wird zu JSON null. Das entspricht dem Default von Thoth.Json und dem F#-Converter in System.Text.Json.
Wie sehen Discriminated Unions in JSON aus?
Default: {"Case":"CaseName","Fields":[...]} — das Tagged-Format, das sauber zurück nach F# mapt. Wenn der Code eigene Attribute nutzt (JsonUnionCase oder ähnlich), respektiert der Converter die und gibt stattdessen die maßgeschneiderte Form aus.
Wie werden DateTime, DateTimeOffset, Guid behandelt?
DateTime und DateTimeOffset kommen als ISO-8601-Strings raus. Guid ist ein standardisierter 8-4-4-4-12 Hex-String. Das ist, was System.Text.Json out of the box liefert.
Lists, arrays, maps — wie werden die gemappt?
list, array und seq werden alle JSON-Arrays. Map<string, 'T> wird ein JSON-Objekt. Tuples werden JSON-Arrays mit gemischten Typen, genau wie die .NET-Serializer das machen.
Kann ich ein ganzes Modul pasten?
Ja. Jeder Top-Level-Record und jede Union wird ein eigener JSON-Eintrag, verschachtelte Records werden ausgepackt. let-Bindings, die Sample-Werte bauen, werden auch erkannt — praktisch, wenn du ein Test-Data-Modul hast.
Wird mein Code gespeichert?
Dein F# wird zur Konvertierung ans Backend geschickt und nicht persistiert — wir loggen den Payload nicht. Bei sensiblem Domain-Code lohnt sich ein kurzer Check vor dem Pasten.
Weitere Tools, die du vielleicht brauchst
F# zu JSON ist ein Baustein. Diese passen gut dazu: