Fundamental Parsing JSON in Flutter

How to parsing JSON in Flutter

Yudi Setiawan
Nusanet Developers
12 min readMar 11, 2019

--

Pengenalan

Sama seperti bahasa pemrograman pada umumnya pasti ada yang namanya pengolahan data yang berbentuk json termasuklah itu di Flutter. Sebelum kita mempelajari bagaimana melakukan Rest API Call di Flutter alangkah lebih baiknya kita memahami penggunaan dasar json dimana, pada artikel ini kita fokus tentang bagaimana kita melakukan parsing json secara manual.

Persiapan

Sebelum kita masuk ke pengolahan json silakan kita buat terlebih dahulu UI main.dart-nya seperti berikut.

Dimana, output dari kode diatas adalah sebagai berikut.

UI Main

Jadi, pada UI tersebut kita ada menyediakan satu widget RaisedButton dan Text yang mana nantinya kita beri listener onPressed pada RaisedButton tersebut untuk membaca data json-nya dan hasil dari bacaan tersebut kita tampilkan ke dalam widget Text.

JSON Sederhana

Untuk contoh sederhananya, silakan buat file json didalam direktori assets seperti berikut.

Buat file sample.json

Lalu, kita buat class model-nya seperti berikut.

Pada class model tersebut, bisa kita lihat terdapat 2 variable yaitu variable name dan age. Lalu, kita juga ada buat constructor-nya dan method toString()-nya. Selain itu, ada satu lagi method yang mungkin asing kita lihat untuk pertama kalinya yaitu method fromJson(). Sebenarnya method ini bernama Named Constructor di Dart. Info lebih lanjut mengenai Named Constructor bisa dibaca disini. Named Constructor tersebut kita buat untuk mengubah data json kedalam bentuk class model. Lalu, kenapa kita pakai type dynamic untuk value di Map-nya? Karena, kita tidak pernah tahu didalam json tersebut kira-kira type apa saja yang bakalan tersedia. Contohnya seperti json yang diatas dimana, disitu ada 2 type yang tersedia yaitu type string dan number.

Sekarang kita buat kode untuk membaca file json-nya.

Pada kode diatas, terdapat 2 keyword yang mungkin belum kita kenal yaitu, async dan await. Lalu, apa fungsinya kedua keyword tersebut. Berikut penjelasannya.

  • async berfungsi untuk memberikan eksekusi bahwa kode tersebut dijalankan secara asynchronous.
  • await berfungsi untuk memberikan eksekusi didalam asynchronous bahwa eksekusi await harus selesai terlebih dahulu (suspending function) lalu, setelah selesai await melakukan prosesnya dilanjutkan mengeksekusi kode berikutnya didalam asynchronous. Jika kita pernah belajar di Kotlin Coroutine itu ada istilahnya async dan await kira-kira fungsinya hampir sama. Untuk info selengkapnya mengenai async dan await bisa kita pelajari di sini.

Sekarang, kita panggil fungsi tersebut didalam listener onPressed si RaisedButton.

Lalu, jangan lupa ya tambahkan assets file sample.json kita didalam file pubspec.yaml seperti berikut.

Jika sudah lalu sync packages get-nya. Dan sekarang coba test jalankan app-nya lalu tap button Read JSON File. Dan lihat apa yang terjadi.

Test baca data JSON sederhana

JSON Array sederhana didalam JSON Object

Sekarang silakan kita ubah lagi file sample.json seperti berikut.

Dikarenakan property hobi merupakan JSON Array maka, kita bisa buat class model-nya seperti berikut.

Untuk mem-parsing JSON Array seperti pada contoh json diatas maka, kita bisa mem-parsing-nya dengan cara List<String>.from(...) . Yang perlu diperhatikan pada contoh json diatas adalah kita lihat bahwa JSON Array-nya itu isinya String semua jadi kita tidak perlu membuat class model si item-nya. Sekarang coba jalankan lagi programnya.

Test baca JSON Array Sederhana

JSON Object didalam JSON Object

Untuk contoh berikut kita akan buat json-nya seperti berikut.

Pada contoh json diatas kita ada menambahkan property github dimana, property tersebut merupakan JSON Object dan didalamnya terdapat property username dan repository. Untuk mem-parsing property github maka, kita perlu membuat class model-nya sendiri.

Lalu, pada class model utamanya kita ubah menjadi seperti berikut.

Sekarang coba kita jalankan lagi programnya.

Test baca JSON Object didalam JSON Object

JSON dengan data yang kompleks

Sekarang kita buat data json-nya menjadi lebih kompleks lagi seperti berikut.

Dikarenakan property articles merupakan JSON Array yang mana item-nya merupakan JSON Object maka, kita buat terlebih dahulu class model dari item JSON Object tersebut.

Lalu, class model utamanya kita ubah menjadi seperti berikut.

Jadi, awalnya kita memanggil json["articles"] yang mana kode ini akan menghasilkan dalam bentuk dynamic . Lalu, kita mapping objek dynamic tersebut dengan cara json["articles"].map((value) => ...) . Didalam mapping tersebut kita parsing item value mapping-nya dengan cara Article.fromJson(value) . Sehingga jika digabung maka kodenya akan menjadi seperti berikut.

Atau biar kita lebih gampang membacanya mungkin bisa kita pisah menjadi seperti berikut.

Dari kode diatas mungkin kita bertanya di kode var listArticles = json["articles"] as List mengapa kita tidak langsung meng-konversi-nya menjadi seperti berikut var listArticles = json["articles"] as List<Article> . Untuk mendapatkan jawabannya silakan kita mencobanya seperti berikut.

Sekarang coba jalankan programnya.

Error vroh

Maka, kita akan mendapatkan pesan error seperti diatas. “Maksud pesan error tersebut apaan sih?” Biar saya jawab ya. Programnya bilang sama kita bahwa hasil casting kita yang ini json["articles"] as List<Articles> ternyata salah. Si Flutter ternyata dia itu tidak tahu sama sekali generic type dari List yang kita casting tersebut. Karena dia tidak tahu generic type dari List tersebut maka si Flutter menganggap-nya sebagai objek List<dynamic> sehingga ketika kita mau melakukan casting dari List<dynamic> ke List<Article> maka programnya pun error karena mengalami kegagalan casting.

Sekarang coba kita kembalikan kode program yang error tadi menjadi semula ya.

Sekarang coba kita jalankan lagi programnya.

Test baca data JSON yang kompleks

JSON dengan dynamic key

Sekarang untuk lebih menantang lagi, coba kita buat data json yang mana key property-nya itu bersifat dynamic seperti berikut.

Pada data json diatas, yang dynamic ialah nilai di property contact dimana, nilai 1 dan 2 itu bersifat dinamis sesuai dengan jumlah data yang tersedia. Mungkin bisa saja nilai item-nya bernilai 3 atau bahkan lebih dari 3. Sekarang coba kita buat class model dari item property Contact.

Lalu, kita buat class model utamanya seperti berikut.

Awalnya kita baca property contact sebagai Map atau JSON Object dengan cara Map.from(json["contact"]) . Sebelum lanjut ke penjelasannya saya mau bertanya terlebih dahulu. “Kira-kira dari kode Map.from(json["contact"] ini akan menghasilkan objek Map dengan generic type apa?”. Jika kita fokus pada kasus sebelumnya yang mengenai casting List tadi seharusnya kita bisa menemukan jawabannya yaitu Map tadi akan menghasilkan objek Map dengan type <String, dynamic>. Kalau tidak percaya coba kita ubah kode diatas menjadi seperti berikut.

Sekarang coba jalankan programnya maka, outputnya di console nanti akan kelihatan tipe dari map contact-nya.

Generic type dari Map.from(json[“contact”])

Sekarang saya lanjutkan lagi penjelasannya mengenai casting dynamic key tadi ya. Tadi kan awalnya kita membuat objek Map dari kode

atau

Sekarang karena tadi Map-nya memiliki generic type-nya <String, dynamic> maka, langkah selanjutnya ialah kita ubah lagi dynamic tersebut menjadi class model-nya yaitu Contact. Caranya

Sekarang ubah kode awal kita tadi yang agak susah dibaca seperti berikut.

menjadi seperti berikut biar gampang baca kode parsing contact-nya.

Sekarang coba jalankan lagi programnya.

Test baca data JSON dengan dynamic key

--

--