100 % lokal — Ihre Daten verlassen nie Ihren Browser

JSON in Dart — fromJson und toJson schon fertig

Ein JSON-Beispiel in Dart-Klassen verwandeln. Die Originalschlüssel stehen in den erzeugten fromJson und toJson — das Mapping ist lesbarer Code.

Sofort Privat Null Cookies

JSON-Eingabe

Dart-Ausgabe

Was dieses Werkzeug tut

Aus einer JSON-Probe werden Dart-Klassen, jede mit einer fromJson-Fabrik und einer toJson-Methode.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
class Root {
  final int id;
  final String firstName;
  final Address address;

  Root({required this.id, required this.firstName, required this.address});

  factory Root.fromJson(Map<String, dynamic> json) => Root(
        id: json['id'] as int,
        firstName: json['firstName'] as String,
        address: Address.fromJson(json['address'] as Map<String, dynamic>),
      );

  Map<String, dynamic> toJson() => <String, dynamic>{
        'id': id,
        'firstName': firstName,
        'address': address.toJson(),
      };
}

Kein build_runner, keine Annotationen, keine erzeugte part-Datei: die Zuordnung steht da und lässt sich ändern.

Der Schlüssel geht nie verloren

Ein Dart-Feldname trägt keinen Bindestrich und beginnt nicht mit einer Ziffer, und class ist reserviert. Muss ein Name sich ändern, behalten beide Richtungen den Schlüssel:

  final String contentType;
  final int class_;

  factory Root.fromJson(Map<String, dynamic> json) => Root(
        contentType: json['content-type'] as String,
        class_: json['class'] as int,
      );

  Map<String, dynamic> toJson() => <String, dynamic>{
        'content-type': contentType,
        'class': class_,
      };

Weil die Zuordnung Code ist und keine Konvention, wird zur Laufzeit nichts geraten — und Sie lesen, was gesendet wird, bevor Sie es senden.

Listen und verschachtelte Objekte

Eine Liste von Objekten wird eine eigene Klasse, und die Zuordnung läuft sie ab:

        items: (json['items'] as List<dynamic>)
            .map((e) => ItemsItem.fromJson(e as Map<String, dynamic>))
            .toList(),

Eine Liste von Skalaren nutzt cast, was billiger ist: (json['tags'] as List<dynamic>).cast<String>().

Was eine Probe nicht sagen kann

Jedes Feld ist final und required, und keines ist nullbar — weil das Dokument für jedes einen Wert hatte. Ein fehlender Schlüssel wird damit beim Dekodieren zu einem TypeError, der das Feld nennt, statt zu einem null, das drei Bildschirme weit reist, bevor es bricht.

Nur ein null ergibt dynamic, das alles annimmt und nichts prüft. Eine leere oder gemischte Liste ergibt List<dynamic>, aus demselben Grund. Das sind die drei Stellen, die eine zweite Nutzlast überprüfen sollte.

Datenschutz ab Werk

Alles läuft lokal in deinem Browser mit JavaScript. Deine Daten werden nie hochgeladen, wodurch das Tool auch für sensible Inhalte sicher ist und offline funktioniert.

Häufige Fragen

Brauche ich json_serializable oder build_runner?
Nein. Die `fromJson`-Fabrik und die `toJson`-Methode stehen vollständig da: die Klasse arbeitet mit `jsonDecode` und sonst nichts. Nutzt Ihr Projekt bereits json_serializable, tut dessen erzeugter Code dasselbe mit Annotationen — diese Ausgabe ist die Fassung, die Sie ohne Build lesen können.
Was passiert, wenn zur Laufzeit ein Schlüssel fehlt?
Der Cast wirft. `json['id'] as int` auf einem fehlenden Schlüssel ist ein `null`, das zu `int` gecastet wird — ein `TypeError`, der das Feld nennt. Das ist das laute Scheitern, und das richtige: eine Probe, in der der Schlüssel immer da war, kann nicht sagen, dass er optional ist. Machen Sie `int?` daraus und streichen Sie das `required`, sobald Sie es wissen.
Kann ich die JSON-Methoden abschalten?
Ja — der Schalter lässt die Klasse mit ihren Feldern und dem Konstruktor zurück. Das hilft, wenn Sie in eine Codebasis einfügen, die Serialisierung anderswo erzeugt, oder wenn die Klasse ein reiner Wertträger ist, der nie auf JSON trifft.

Ähnliche Konverter