pemrograman

05 Mengenal JSON Array

Pengenalan JSON Array

Selain JSON berbentuk Objek, biasanya dalam JSOn juga kita bisa menggunakan tipe data Array. Sebenarnya array JSON itu mirip seperti yang ada pada JavaScript yang mana di dalamnya terdapat tipe data primitif atau tipe data komplek seperti array objek.

Pada Golang, JSON Array ini direpresentasikan dalam bentuk slice yang mana nanti ketika kita mengkonversikan dari JSON atau ke JSON akan dilakukan secara otomatis menggunakan package json menggunakan tipe data slice. Secara penggunaan fungsi yang dipakai sama saja seperti fungsi sebelumnya yaitu saat membuat JSON menggunakan

func json.Marshal(interface{})

dan untuk konversi menjadi data pada Golang menggunakan

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

Cara Implementasi

Misalkan kita akan coba agar struct yang kita buat sebelumnya tambahkan tipe data array seperti dibawah ini.

type Customer struct {
	FirstName  string   `json:"first_name"`
	MiddleName string   `json:"middle_name"`
	LastName   string   `json:"last_name"`
	Hobbies    []string `json:"hobbies"`
}

Kita coba jalankan unit test untuk yang sebelumnya sudah dibuat yaitu pada fungsi TestGenerateObjectJSON. Maka akan terlihat FAIL unit test karena terdapat tipe data baru yang kita tambahkan.

--- FAIL: TestGenerateObjectJSON (0.00s)
    --- FAIL: TestGenerateObjectJSON/success_generate_object_JSON (0.00s)
        /Users/ihsanarif/Documents/ihsan/tutorial/learn-golang-json/main_test.go:96: GenerateObjectJSON() = {"first_name":"Santekno","middle_name":"Ihsan","last_name":"Arif","hobbies":null}, want {"first_name":"Santekno","middle_name":"Ihsan","last_name":"Arif"}
FAIL
FAIL	github.com/santekno/learn-golang-json	0.498s
FAIL

Kita perlu mengubah unit test tersebut agar bisa mendukung data array yang terdapat pada struct Customer menjadi seperti dibawah ini.

func TestGenerateObjectJSON(t *testing.T) {
	type args struct {
		data Customer
	}
	tests := []struct {
		name string
		args args
		want string
	}{
		{
			name: "success generate object JSON",
			args: args{
				data: Customer{
					FirstName:  "Santekno",
					MiddleName: "Ihsan",
					LastName:   "Arif",
					Hobbies:    []string{"badminton", "renang", "coding"},
				},
			},
			want: string(`{"first_name":"Santekno","middle_name":"Ihsan","last_name":"Arif","hobbies":["badminton","renang","coding"]}`),
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := GenerateObjectJSON(tt.args.data); got != tt.want {
				t.Errorf("GenerateObjectJSON() = %v, want %v", got, tt.want)
			}
		})
	}
}

Pada fungsi unit test TestConvertObjectJSON tidak terjadi FAIL karena untuk marshal jika tidak diset JSON tersebut tidak akan muncul menjadi key pada JSON objek. Tetapi agar seragam semua kita ubah juga unit test ini menjadi 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","hobbies":["badminton","renang","coding"]}`),
			},
			want: Customer{
				FirstName:  "Santekno",
				MiddleName: "Ihsan",
				LastName:   "Arif",
				Hobbies:    []string{"badminton", "renang", "coding"},
			},
		},
	}
	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