Parsing JSON: Model dan fromJson
Ubah JSON mentah menjadi objek Dart yang type-safe dengan factory fromJson dan toJson yang benar.
Kenapa butuh model?
Bekerja dengan Map<String, dynamic> mentah itu rawan typo dan tidak ada bantuan IDE. Model class mengubah JSON menjadi objek dengan tipe jelas, sehingga salah ketik nama field ketahuan saat compile, bukan saat aplikasi crash di tangan user.
Model manual dengan fromJson
class Produk {
final String id;
final String nama;
final int harga;
final double? rating;
final List<String> tags;
const Produk({
required this.id,
required this.nama,
required this.harga,
this.rating,
this.tags = const [],
});
factory Produk.fromJson(Map<String, dynamic> json) {
return Produk(
id: json['id'] as String? ?? '',
nama: json['nama'] as String? ?? 'Tanpa nama',
harga: (json['harga'] as num?)?.toInt() ?? 0,
rating: (json['rating'] as num?)?.toDouble(),
tags: (json['tags'] as List<dynamic>?)
?.map((e) => e as String)
.toList() ??
const [],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'nama': nama,
'harga': harga,
'rating': rating,
'tags': tags,
};
}
}Setiap field dibaca defensif: cast ke tipe nullable, beri default kalau null. API di dunia nyata sering tidak konsisten, dan model yang defensif mencegah crash.
Menangani angka yang tidak pasti
API kadang mengirim harga sebagai int (50000), kadang sebagai double (50000.0). Pola (json['harga'] as num?)?.toInt() menangani keduanya karena num adalah parent dari int dan double. Ini trik kecil yang menyelamatkan banyak crash.
Nested object dan list
Untuk JSON bersarang, buat model terpisah dan panggil fromJson-nya:
class Transaksi {
final String id;
final Produk produk;
final int jumlah;
const Transaksi({required this.id, required this.produk, required this.jumlah});
factory Transaksi.fromJson(Map<String, dynamic> json) {
return Transaksi(
id: json['id'] as String? ?? '',
produk: Produk.fromJson(json['produk'] as Map<String, dynamic>? ?? {}),
jumlah: (json['jumlah'] as num?)?.toInt() ?? 0,
);
}
}Code generation untuk project besar
Untuk puluhan model, menulis manual melelahkan dan rawan salah. Package json_serializable men-generate fromJson/toJson otomatis lewat build_runner. Di awal belajar, tulis manual dulu agar paham mekanismenya, lalu adopsi codegen saat project membesar.
Catatan teknis: Jangan pernah memakai
json['field']tanpa cast dan langsung dioper ke widget, karena tipenyadynamicdan error baru muncul saat runtime. Selalu cast eksplisit (as String?) di fromJson. Satu lokasi parsing yang ketat melindungi seluruh aplikasi dari data API yang nakal.