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)
}
})
}
}