pemrograman

Golang JSON 07 Penggunaan Maps

Penggunaan Map

Saat kita menggunakan JSON kita kadang menemukan kasus data JSON yang dinamis yang artinya atribut yang dibentuk JSON tidak tentu, bisa bertambah bisa berkurang dan bahkan tidak tetap. Maka kasus seperti ini jika kita unmarshal menggunakan Struct akan menyulitkan karena pada struct kita harus definisikan semua atribut-nya.

Dalam kasus ini ada cara lain yaitu kita bisa menggunakan tipe data map[string]interface{}. Dengan menggunakan map ini maka akan secara otomatis atribute akan menjadi key di map dan value menjadi value JSON di map tetapi value disini berupa interface maka perlu ada konversi lagi secara manual jika ingin mengambil value-nya.

Pada tipe data map ini JSON tags tidak berlaku lagi atau tidak akan mendukung lagi karena semua key JSON tersebut akan menjadi key pada map yang tidak bisa dialiaskan.

Contoh Penggunaan Maps

Kita coba contohkan bagaimana kita menggunakan map untuk melakukan konversi dari JSON dibawah ini.

func ConvertMapJSON(data string) map[string]interface{} {
	var result map[string]interface{}
	err := json.Unmarshal([]byte(data), &result)
	if err != nil {
		panic(err)
	}

	return result
}

Fungsi yang sudah kita buat diatas ini, bagaimana kita mengkonversikan dari data json ke dalam map yang hasilnya akan berupa map[string]interface.

Kita tambahkan juga unit test untuk menguji fungsi yang sudah kita buat apakah sesuai ekspektasi atau tidak.

func TestConvertMapJSON(t *testing.T) {
	type args struct {
		data string
	}
	tests := []struct {
		name string
		args args
		want map[string]interface{}
	}{
		{
			name: "success convert map JOSN",
			args: args{
				data: string(`{"first_name":"Santekno","middle_name":"Ihsan","last_name":"Arif"}`),
			},
			want: map[string]interface{}{
				"first_name":  "Santekno",
				"middle_name": "Ihsan",
				"last_name":   "Arif",
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := ConvertMapJSON(tt.args.data); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("ConvertMapJSON() = %v, want %v", got, tt.want)
			}
		})
	}
}
comments powered by Disqus