Decode JSON di Golang

taken from here

Kalau di dunia Javascript, kita gak perlu susah-susah buat parsing JSON, karena di Javascript JSON udah berbentuk objek, jadi tinggal ambil valuenya saja sesuai key yang diinginkan. Tapi, bagaimana kalau misalkan mau parsing JSON di Go?

Tulis struktur datanya dahulu

Kita tidak bisa serta merta langsung pakai JSON nya tanpa di parsing dahulu. Sebelum bisa dilakukan parsing, kita harus menulis struktur datanya terlebih dahulu. Kalau di Go, kita harus tulis struct nya terlebih dahulu, biar enak ambil datanya hehe.

Sebagai contoh, kita mau parsing JSON dari API milik Github, sebagai contoh saya pakai API buat list repository disini.

Kalau dilihat struktur responsenya, seperti ini

Nah, bagaimana caranya kita bikin struct yang nanti isinya id repository, owner detail, nama repository, jumlah fork, stars, maupun watchernya? Kita bisa tulis struct nya sebagai berikut

Wait. Kenapa owner repository (line 8) nya kok struct juga? Karena di JSON response, key owner memiliki value bertipe objek, sehingga value dari Owner di struct Repository harus bertipe struct juga. Dan, di Go tidak mengenal objek, apalagi OOP 😂, makanya untuk mapping JSON object kita pakai struct di Go.

Nah yang seperti ini…

`json:”forks_count”`

… merupakan JSON field tags. Jika JSON field tags nya tidak sesuai dengan JSON response yang asli, maka tidak akan bisa di map ke field-field structnya.

Request + Parsing

Setelah menulis struct nya, baru saatnya kita bisa mapping dari JSON response ke struct.

  1. Buat request ke Github API dengan kode dibawah

Di baris 12, akan mengembalikan multiple value, response dan error. Jika request berhasil, maka err akan nil . Jika terjadi error ketika proses request err != nil, maka akan melakukan panic call.

2. Parsing body

Setelah mendapatkan response, barulah kita bisa parse response body yang berupa JSON itu.

Sebelum kita bisa mapping ke struct, kita perlu membaca semua response body dan mengembalikan resultnya ke array byte (line 18). Jika tidak terjadi error, maka kita akan dapat array byte response body nya.

Setelah dapat array byte dari pembacaan response body, maka selanjutnya tinggal bikin array dari struct Repository di line 24, lalu di line 25 kita baru melakukan unmarshal dari array byte response body menjadi array struct bertipe Repository.

Di baris 28 akan meng-output kan tiap structnya seperti ini

{87759079 {99ridho User} algo-ds-js 0 0 0}
{74442710 {99ridho User} bep 0 0 0}
{88159572 {99ridho User} blog 0 0 0}
{54103998 {99ridho User} cg-codes 0 0 0}
{92483721 {99ridho User} design-pattern-final-project 0 0 0}
{91081796 {99ridho User} malang-angkot-tracker-consumer 0 1 1}
{61374035 {99ridho User} project-akhir-grafkom 0 0 0}
{89175692 {99ridho User} rcv 0 1 1}
{89247129 {99ridho User} RDPFlatUIControl 0 2 2}
{92569134 {99ridho User} react-native-belajar-hijaiyah 2 3 3}
{91146540 {99ridho User} rxswift-moya-mvvm-example 0 1 1}
{61013959 {99ridho User} splash-screen 0 0 0}
{86444563 {99ridho User} talks 1 0 0}
{86919819 {99ridho User} todolist-mvvm-rxswift 0 5 5}

Mudah bukan?

Sekian tulisan receh saya setelah lama tidak nulis, semoga bermanfaat 😊.