🎓 KELAS 11 · SEMESTER 2 · RPL

BAB 2

JSON & DATA MODELING

Mobile Development · Flutter & Dart

BAB 202 / 22Peta Konsep

🗺️ Roadmap Perjalanan Kita

Inilah peta materi BAB 2. Kita akan berjalan dari memahami JSON sampai membangun Mini Project yang mengambil data asli dari API.

01-03

Pengenalan

Apa itu JSON, struktur, tipe data

04-07

Dasar JSON

Struktur, tipe, JSON vs Dart

08-10

Parsing

Decode, Encode, Serialization

11-13

Model Class

fromJson() & toJson()

14-16

Lanjutan

Nested, List, Generator

17-19

Mini Project

API → Model → ListView

20-22

Latihan

Quiz & Tugas Akhir

BAB 203 / 22Tujuan Pembelajaran

🎯 Setelah Bab Ini Kamu Bisa...

Menjelaskan apa itu JSON dan kenapa dipakai untuk bertukar data.

Membaca struktur JSON: key-value, array, object, dan tipe datanya.

Melakukan parsing (jsonDecode) & serialization (jsonEncode) di Dart.

Membuat Model Class dengan fromJson() dan toJson().

Membangun mini app yang fetch data API → parse → tampilkan di ListView.

BAB 204 / 22Apa Itu JSON?

Bayangkan kamu memesan lewat GoFood dan dapat struk digital. Struk itu berisi: nama makanan, harga, jumlah, nama warung — semuanya tersusun rapi dan berlabel. Siapapun yang membaca struk itu langsung paham. Itulah JSON: catatan data terstruktur yang bisa dibaca manusia DAN komputer.

🧾 STRUK GOFOOD

WarungNasi Padang Sederhana
MenuRendang
HargaRp 25.000
Jumlah2
TOTALRp 50.000

JSON (JavaScript Object Notation) adalah format teks untuk menyimpan & mengirim data. API yang sudah kamu pelajari di BAB 1 selalu mengembalikan data dalam format JSON. Strukturnya berupa pasangan "kunci": nilai, persis seperti label dan isi di struk belanja.

contoh.json
{"id": 1, "nama": "Laptop Gaming", "harga": 15000000, "tersedia": true}
BAB 205 / 22Struktur Dasar JSON

Seperti label di toples bumbu dapur ibu: di luar tertulis "Garam" (kunci), di dalam ada isinya (nilai). Satu label = satu isi. JSON juga begitu: setiap kunci menunjuk ke satu nilai.

{"kunci":"nilai"}

Aturan dasar: kunci selalu di dalam tanda kutip dua "...", dipisah : dengan nilainya, dan antar pasangan dipisah koma ,. Seluruhnya dibungkus kurung kurawal { } (object).

{
  "nama": "Budi",
  "umur": 17,
  "kelas": "11 RPL"
}
BAB 206 / 22Tipe Data JSON

🏷️ 6 Tipe Data dalam JSON

"teks" → String 42 → Number 3.14 → Double true → Boolean null → Null [1,2,3] → Array {...} → Object

String pakai kutip, Number & Boolean tidak. Array [ ] menampung daftar nilai, Object { } menampung pasangan kunci-nilai (bisa bersarang!).

{
  "teks": "Laptop",
  "bulat": 42,
  "desimal": 3.14,
  "aktif": true,
  "kosong": null,
  "angka": [1, 2, 3],
  "detail": { "nested": true }
}
BAB 207 / 22JSON vs Dart Map

JSON itu seperti surat dalam amplop (teks mentah yang dikirim), sedangkan Dart Map adalah isi surat yang sudah dibuka dan siap dipakai di dalam aplikasi.

📨 JSON (String)

'{"id":1,"nama":"Laptop"}'

Sekadar teks. Belum bisa diakses per-field.

🎯 Dart (Map)

Map<String, dynamic> data =
    {"id": 1, "nama": "Laptop"};
print(data["nama"]); // Laptop

Sudah bisa diakses: data["nama"].

BAB 208 / 22Parsing JSON (jsonDecode)

Dapat surat berbahasa Inggris dari teman luar negeri? Kamu butuh menerjemahkannya ke Bahasa Indonesia agar paham. Parsing adalah proses menerjemahkan teks JSON menjadi objek Dart yang bisa dipakai.

JSON String
"{...}"
⚙️
Dart Map
{...}
import 'dart:convert';

String jsonString = '{"id":1,"nama":"Laptop","harga":15000000}';
Map<String, dynamic> data = jsonDecode(jsonString);
print(data['nama']); // Output: Laptop

Ketik JSON lalu klik Parse. Coba juga JSON yang salah untuk lihat penanganan error!

BAB 209 / 22Serialization (jsonEncode)

Saat packing koper untuk mudik, kamu memasukkan semua barang (baju, sepatu, charger) ke dalam satu tas rapi yang bisa dibawa. Serialization = mengemas objek Dart menjadi satu string JSON yang bisa dikirim ke API.

idnama hargatersedia 🧳
import 'dart:convert';

Map<String, dynamic> product = {"id": 1, "nama": "Laptop", "harga": 15000000};
String jsonString = jsonEncode(product);
print(jsonString); // {"id":1,"nama":"Laptop","harga":15000000}
// hasil JSON akan muncul di sini
BAB 210 / 22Deserialization

Sampai di rumah nenek, kamu buka koper dan ambil satu per satu barang untuk diletakkan di tempatnya. Deserialization = membuka string JSON dan mengisi nilainya ke variabel-variabel Dart.

🧳 id = 1nama = "Laptop" harga = 15jt

Encode (Serialize) = Dart → JSON (mengemas). Decode (Deserialize) = JSON → Dart (membuka). Keduanya kebalikan satu sama lain.

import 'dart:convert';

String jsonString = '{"id":1,"nama":"Laptop","harga":15000000}';
Map<String, dynamic> data = jsonDecode(jsonString);

int id        = data['id'];
String nama   = data['nama'];
int harga     = data['harga'];
print('$nama seharga $harga'); // Laptop seharga 15000000
BAB 211 / 22Model Class

Sebelum membangun rumah, arsitek membuat cetak biru (blueprint) dulu. Model Class adalah cetak biru data — mendefinisikan bentuk & tipe setiap properti SEBELUM data JSON diisi.

class Product {
  final int id;
  final String nama;
  final double harga;
  final bool tersedia;

  Product({
    required this.id,
    required this.nama,
    required this.harga,
    required this.tersedia,
  });
}
💡 Dengan Model Class, IDE bisa autocomplete product.nama dan kamu terhindar dari salah ketik nama field.
BAB 212 / 22factory Product.fromJson()

fromJson() adalah pintu masuk: ia menerima Map hasil jsonDecode dan mengubahnya menjadi objek Product. Perhatikan baris muncul satu per satu:

factory Product.fromJson(Map<String, dynamic> json) {
return Product(
id: json['id'] as int,
nama: json['nama'] as String,
harga: (json['harga'] as num).toDouble(),
tersedia: json['tersedia'] as bool,
);
}
⚠️ harga dibungkus (... as num).toDouble() karena JSON bisa mengirim 15000000 (int) tapi field kita bertipe double.
BAB 213 / 22toJson()

toJson() adalah pintu keluar: mengubah objek Product kembali menjadi Map yang siap di-jsonEncode dan dikirim ke API. Arahnya kebalikan dari fromJson().

Map<String, dynamic> toJson() {
return {
'id': id,
'nama': nama,
'harga': harga,
'tersedia': tersedia,
};
}

fromJson

JSON ➜ Object
(masuk)

toJson

Object ➜ JSON
(keluar)

BAB 214 / 22Nested JSON

Seperti boneka Matryoshka (boneka Rusia): di dalam boneka ada boneka lagi, dan di dalamnya ada boneka lagi. Nested JSON = JSON di dalam JSON.

class Order {
  final int id;
  final Product product;
  final Address address;

  Order.fromJson(Map<String, dynamic> json)
      : id      = json['id'],
        product = Product.fromJson(json['product']),
        address = Address.fromJson(json['address']);
}
BAB 215 / 22List JSON

Buka Tokopedia — kamu tidak melihat satu produk, tapi puluhan produk sekaligus. List JSON = array [ ] berisi banyak objek JSON.

Laptop GamingRp 15.000.000
Mouse WirelessRp 350.000
Keyboard MekanikRp 750.000
Headset GamingRp 500.000
List<Product> parseProducts(String jsonBody) {
  final List parsed = jsonDecode(jsonBody);
  return parsed.map((e) => Product.fromJson(e)).toList();
}
🔑 Kunci: .map((e) => Product.fromJson(e)) menjalankan fromJson untuk SETIAP item dalam array, lalu .toList() mengubahnya jadi List<Product>.
BAB 216 / 22JSON → Model Generator

Menulis fromJson manual untuk class besar itu melelahkan. Tool seperti quicktype & package json_serializable bisa meng-generate kode model otomatis dari contoh JSON. Coba simulasinya:

Input JSON
Output Dart Class
// class akan di-generate...
⚙️ Di project nyata: tambahkan json_serializable + build_runner ke pubspec, beri anotasi @JsonSerializable(), lalu jalankan dart run build_runner build.
BAB 217 / 22Mini Project — Arsitektur

🏗️ Alur Data: dari API ke Layar

🌐 API JSON
🔓 jsonDecode
🏭 fromJson()
📦 List<Product>
📱 ListView

Setiap panah adalah satu langkah transformasi data. Project kita: ambil produk dari fakestoreapi.com, ubah jadi List<Product>, lalu tampilkan rapi di ListView.builder.

BAB 218 / 22Mini Project — Part 1: Setup

Langkah 1 — Tambah dependency & buat Model

pubspec.yaml
product_model.dart
dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.0
class Product {
  final int id;
  final String nama;
  final double harga;

  Product({required this.id, required this.nama, required this.harga});

  factory Product.fromJson(Map<String, dynamic> json) {
    return Product(
      id:    json['id'] as int,
      nama:  json['title'] as String,
      harga: (json['price'] as num).toDouble(),
    );
  }
}
🧪 Dummy JSON untuk uji coba sebelum fetch asli: {"id":1,"title":"Tas","price":120.5}
BAB 219 / 22Mini Project — Part 2: Fetch & Tampil
API
jsonDecode
fromJson
List
UI
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<List<Product>> fetchProducts() async {
  final res = await http.get(Uri.parse('https://fakestoreapi.com/products'));
  if (res.statusCode == 200) {
    final List data = jsonDecode(res.body);
    return data.map((e) => Product.fromJson(e)).toList();
  }
  throw Exception('Gagal memuat produk');
}
FutureBuilder<List<Product>>(
  future: fetchProducts(),
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      final list = snapshot.data!;
      return ListView.builder(
        itemCount: list.length,
        itemBuilder: (_, i) => ListTile(
          title: Text(list[i].nama),
          trailing: Text('Rp ${list[i].harga}'),
        ),
      );
    }
    return const Center(child: CircularProgressIndicator());
  },
)
BAB 220 / 22Latihan 1 — Parse JSON

✏️ Soal

Diberikan JSON berikut:

{"id": 5, "nama": "Mouse Gaming", "harga": 350000}

Tuliskan kode Dart untuk mendapatkan nilai nama dari string JSON tersebut (gunakan jsonDecode).

BAB 221 / 22Latihan 2 — Lengkapi Model

✏️ Lengkapi tipe data yang kosong

Isi setiap kotak dengan tipe data Dart yang benar (int / String / double / bool).

class Product {
  final  id;
  final  nama;
  final  harga;
  final  tersedia;
}

Petunjuk: id=bilangan bulat, nama=teks, harga=desimal, tersedia=benar/salah.

BAB 222 / 22Tugas Akhir 🏆

🏆 Product Catalog App

Buat aplikasi Flutter yang menampilkan katalog produk dari https://fakestoreapi.com/products.

  • Step 1: Buat class Product dengan fromJson() (id, title, price, image).
  • Step 2: Fetch data memakai package http.
  • Step 3: Parse JSON array menjadi List<Product> dengan .map().
  • Step 4: Tampilkan dengan ListView.builder (nama + harga + gambar).
  • Model class lengkap dengan fromJson() yang benar
  • Fetch data berhasil (status 200 ditangani)
  • Parsing List berjalan tanpa error
  • UI menampilkan minimal nama & harga tiap produk
  • Ada loading indicator & penanganan error
🎉 Selamat! Kamu sudah menyelesaikan BAB 2 — JSON & Data Modeling. Sekarang kamu bisa mengubah data API menjadi aplikasi nyata!