Zum Hauptinhalt springen

JSON in C# umwandeln

Dieses Tool erzeugt aus einem Beispieldokument in Ihrem Browser Klassen oder Records. Eigenschaftsnamen sind PascalCase, und jede trägt ein explizites Attribut mit dem ursprünglichen JSON-Schlüssel, denn System.Text.Json unterscheidet standardmäßig Groß- und Kleinschreibung – eine PascalCase-Eigenschaft bindet nicht an einen snake_case-Schlüssel, ohne dass man es ihr sagt.

Nur lokal
Struktur
Beispiel-JSON
0 B1 ZeileZ. 1, Sp. 1
Syntaxfehler · Fehler in Zeile 1, Spalte 1

Das Dokument endet zu früh – es scheint abgeschnitten.


^
Generierter Codeschreibgeschützt
0 B1 Zeile
Fügen Sie nach Möglichkeit mehrere Datensätze ein. Nur so werden optionale Felder erkannt, die nicht in jeder Zeile vorkommen.

Wie funktioniert JSON in C# umwandeln?

Bei C# verändert die Einstellung für Nullable Reference Types, wie korrekte Ausgabe aussieht; der Generator behandelt sie daher als vollwertige Option und nicht als Formatierungsdetail.

Nullable Reference Types bestimmen die Form jedes Members

Unter <Nullable>enable</Nullable>, dem Standard in jeder Vorlage seit .NET 6, ist eine string-Eigenschaft, die JSON fehlen kann, eine Warnung, die nur darauf wartet einzutreten – und eine NullReferenceException, wenn man die Warnung ignoriert. Optionale und nullable Felder bekommen deshalb ein ? – bei einem Wertetyp ist das Nullable<T>, bei einem Referenztyp die Annotation. Beides wird T? geschrieben, was zu den ordentlicheren Seiten der Sprache gehört.

Nicht-nullable Member brauchen einen Initialisierer, sonst schlägt CS8618 bei jedem einzelnen an

Ein erforderliches string Name { get; set; } warnt, dass die Eigenschaft nicht initialisiert ist, denn der Compiler kann nicht sehen, dass ein Deserializer sie füllen wird. Die konventionelle Antwort für generierten Code ist = null!; – ein explizites Versprechen an den Compiler, dass etwas anderes den Wert zuweist. Ohne das erzeugt die generierte Datei eine Warnung pro Eigenschaft, was die Leute dadurch zu reparieren pflegen, dass sie Nullable abschalten – womit sie den Grund wegwerfen, es überhaupt einzusetzen.

Attribute sind explizit, keine Konvention

System.Text.Json beachtet beim Abgleich der Eigenschaftsnamen die Groß- und Kleinschreibung, sofern nicht anders konfiguriert; UserId bindet also nicht an user_id und bleibt stillschweigend null. Jede Eigenschaft bekommt ein [JsonPropertyName] (bei Newtonsoft [JsonProperty]) mit dem exakten ursprünglichen Schlüssel, damit die Klasse funktioniert, egal wie die Serialisierer-Optionen gerade stehen.

class oder record

Für ein deserialisiertes Payload ist ein record der bessere Standard – Wertgleichheit und ein lesbares ToString gibt es gratis, und ein DTO sollte nach seiner Ankunft nicht verändert werden. Sehr viel Code erwartet weiterhin eine veränderbare Klasse mit beschreibbaren Eigenschaften, also stehen beide zur Verfügung.

long, wo int abschneiden würde

int ist 32 Bit. Jeder Beispielwert jenseits von 2,147,483,647 – eine Snowflake-ID, ein Millisekunden-Zeitstempel – wird als long ausgegeben, denn eine abgeschnittene ID ist ein Bug, der erst auftaucht, wenn echte Daten ankommen.

Beispiel

[
  { "user_id": 900719925474099, "name": "Ada" },
  { "user_id": 12, "name": "Grace", "team": "ops" }
]

Generiert

public class User
{
    [JsonPropertyName("user_id")]
    public long UserId { get; set; }

    [JsonPropertyName("name")]
    public string Name { get; set; } = null!;

    [JsonPropertyName("team")]
    public string? Team { get; set; }
}

Welche Optionen und Sonderfälle unterstützt JSON in C# umwandeln?

Technische Referenz und Optionen
ParameterTypStandardVerhalten & Sonderfälle
Formclass / recordclassrecord gibt Wertgleichheit und eine nützliche ToString-Methode, was für DTOs geeignet ist. class bleibt veränderlich und entspricht dem, was älterer Code erwartet.
NamespaceBezeichnerGeneratedUmschließt die Ausgabe in einem Namespace-Block. Lassen Sie ihn leer, um bloße Typen für eine Datei auszugeben, die bereits einen hat.
System.Text.JsonBooleschonErzeugt [JsonPropertyName] und den passenden using-Befehl. Schalten Sie es für [JsonProperty] und Newtonsoft.Json aus, was immer noch die richtige Wahl für alles unter .NET Framework ist.
nullableBooleschonErzeugt #nullable enable, markiert optionale Member als T? und initialisiert erforderliche Referenzmember mit = null!, damit CS8618 nicht bei jeder Eigenschaft ausgelöst wird.
stringC#-TypstringErkannte Formate werden nicht auf DateTime oder Guid abgebildet. System.Text.Json analysiert ISO 8601 in DateTime, wenn Sie den Typ manuell ändern, wirft aber einen Fehler bei jedem Datensatz, der ein Datum anders formatiert.
integerC#-Typint / longlong, wenn ein Beispiel 2,147,483,647 überschreitet. JSON-Numbers haben keine deklarierte Breite, daher wird dies aus den Werten gelesen.
arrayC#-TypList<T>List<T> anstelle von T[], da beide Serialisierer damit umgehen können und es das ist, was aufrufender Code normalerweise erwartet. Ein Array gemischter Typen wird zu List<object>.
Verschachteltes Objektclasseigener TypWird zu seiner eigenen Klasse befördert, vor der deklariert, die sie verwendet. Identische Formen teilen sich eine Klasse anstatt Address, Address2, Address3 zu erzeugen.

Häufig gestellte Fragen

Warum hat jede Eigenschaft ein Attribut, wenn meine Schlüssel bereits PascalCase sind?

Weil die Zuordnung nur mit einem garantiert ist. System.Text.Json beachtet die Groß- und Kleinschreibung, sofern PropertyNameCaseInsensitive nicht gesetzt ist, und selbst dann überbrückt es user_id nicht zu UserId – das bräuchte eine Naming Policy, deren Konfiguration die generierte Klasse nicht voraussetzen kann. Ein explizites Attribut macht die Klasse unter beliebigen Serialisierer-Optionen korrekt, und das ist die Zeile wert.

Was ist = null!, und kann ich es löschen?

Es sagt dem Compiler, dass eine nicht-nullable Referenzeigenschaft von etwas zugewiesen wird, das er nicht sehen kann – dem Deserializer –, und unterdrückt CS8618. Löschen können Sie es, wenn Sie die Eigenschaft required machen (C# 11) oder sie in einem Konstruktor initialisieren. Was Sie nicht tun sollten: Nullable Reference Types abschalten, damit die Warnungen verschwinden. Das ist die übliche Reaktion und wirft genau die Funktion weg, die die echte null gefunden hätte.

Sollte ich record oder class verwenden?

record für ein Payload, das Sie deserialisieren und lesen: Wertgleichheit macht Tests deutlich sauberer, und Unveränderbarkeit ist für Daten, die von anderswo kommen, korrekt. class, wenn das Objekt verändert werden soll, wenn Ihr Framework älter als C# 9 ist oder wenn eine bestehende Codebase überall beschreibbare Eigenschaften erwartet.

Warum ist mein Datum ein string?

Weil ein aus einem Beispiel generiertes DateTime eine Klasse produzieren würde, die beim ersten Datensatz eine Ausnahme wirft, dessen Datum anders formatiert ist. System.Text.Json akzeptiert nur ISO 8601, echte APIs liefern Unix-Zeitstempel, Datumsangaben im US-Format und Offsets ohne Doppelpunkt. Das erkannte Format wird vermerkt, damit Sie den Typ bewusst ändern können – mit einem Converter, falls das Format einen braucht.

Newtonsoft oder System.Text.Json?

System.Text.Json für alles auf modernem .NET – es ist im Lieferumfang enthalten, deutlich schneller, und dorthin fließt die Weiterentwicklung. Newtonsoft, wenn Sie auf .NET Framework sind oder von etwas abhängen, das System.Text.Json bislang nicht kann: TypeNameHandling, eigene Contract Resolver oder das tolerantere Parsen von fehlerhafter Eingabe. In beiden Fällen erzeugt der Generator die richtigen Attribute.

Wird mein JSON hochgeladen?

Nein. Das Dokument wird geparst, die Typen abgeleitet und der Code in dem Tab gerendert, den Sie schon offen haben. Prüfen können Sie das im Netzwerk-Panel. Der Grund ist der übliche: Die Beispiele, die Leute in einen Klassengenerator einfügen, sind echte Antworten, oft noch mit Kundendaten darin.