pemrograman

04 Mengenal Decode JSON

Pengenalan Decode JSON

Pada artikel sebelumnya kita sudah belajar encode JSON dan cara membuat JSON Object, maka selanjutnya kita akan mempelajari bagaimana untuk mentranslate dari JSON objek menjadi ke dalam objek struct pada Golang. Konversi dari JSON ke dalam Golang objek struct ini sering kita sebut dengan decode.

Pada Golang, untuk melakukan konversi atau dikenal decode ini kita akan menggunakan fungsi.

json.Unmarshal(byte[],interface{})

Fungsi diatas ini memiliki 2 parameter yaitu

  • byte[] adalah data dari JSON yang akan dikonversi
  • interface{} adalah tempat untuk menyimpan hasil dari konversi berupa pointer struct yang kita buat pada Golang.

Cara Impelmentasi

Apakah teman-teman sudah mulai terbayang? Baiklah kita akan coba membuat suatu fungsi yang bisa melakukan konversi data dari JSON Objek ke dalam Objek struct pada Golang. Berikut teman-teman coba buat fungsi dibawah ini.

func ConvertObjectJSON(data string) Customer {
	var cust Customer
	err := json.Unmarshal([]byte(data), &cust)
	if err != nil {
		panic(err)
	}

	return cust
}

Lihat pada fungsi diatas, akan terlihat karena data berupa tipe string maka kita perlu konversikan terlebih dahulu menjadi byte dengan menggunakan []byte(data), maka hasil dari konversi tersebut akan kita simpan di dalam struct yang sudah diinisialisikan dalam variabel cust.

Karena harus pointer yang dikirim? Unmarshal tersebut akan melakukan konversi terhadap data JSON byte tersebut dan akan dikirim value-nya ke dalam suatu variabel pointer agar tidak terdapat variabel yang nil. Maka diperlukan pointer suatu variabel akan mengalokasikan memori untuk penyimpanan yang tidak nil. Dalam penjelasan dokumentasinya pun seperti ini.

Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. If v is nil or not a pointer, Unmarshal returns an InvalidUnmarshalError.

Dan cara kerja dari unmarshal tersebut seperti ini

To unmarshal JSON into a struct, Unmarshal matches incoming object keys to the keys used by Marshal (either the struct field name or its tag), preferring an exact match but also accepting a case-insensitive match. By default, object keys which don't have a corresponding struct field are ignored (see Decoder.DisallowUnknownFields for an alternative).

Selanjutnya kita akan menguji fungsi diatas dengan membuat unit test seperti dibawah ini.

func TestConvertObjectJSON(t *testing.T) {
	type args struct {
		data string
	}
	tests := []struct {
		name string
		args args
		want Customer
	}{
		{
			name: "success conversion object JSON",
			args: args{
				data: string(`{"first_name":"Santekno","middle_name":"Ihsan","last_name":"Arif"}`),
			},
			want: Customer{
				FirstName:  "Santekno",
				MiddleName: "Ihsan",
				LastName:   "Arif",
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := ConvertObjectJSON(tt.args.data); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("ConvertObjectJSON() = %v, want %v", got, tt.want)
			}
		})
	}
}
comments powered by Disqus