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.