Pengenalan JSON Tags
Secara default jika kita membuat struct dan di marshal akan dimapping sesuai dengan nama atribut yang sama dan case sensitive. Lalu bagaimana jika kita ingin membedakan style antara penamaan atribute pada struct dengan yang di convert ke dalam JSON? Misalkan pada struct kita menggunakan PascalCase
tetapi pada JSON kita ingin menggunakan snake_case
. Untuk mendukung hal tersebut maka package json sudah mendukung Tags Reflection yaitu tags yang bisa menyesuaikan nama json yang nanti akan kita convert ke dalam JSON tersebut sehingga tribute yang ada di struct itu akan di konversi sesuai dengan penamaan ke dalam JSON.
Bisa dipahami? Baiklah kita akan coba menerapkan dan menjelaskan lebih lanjut pada tahapan selanjutnya dibawah ini.
type Customer struct {
FirstName string `json:"first_name"`
MiddleName string `json:"middle_name"`
LastName string `json:"last_name"`
Hobbies []string `json:"hobbies"`
}
Sebenarnya pada pertemuan sebelumnya kita sempat menggunakan Tags Reflection ini cuma belum kita jelaskan lebih lanjut. Nah kita akan coba lebih mendalam menjelaskan tags di pertemuan kali ini.
Pada Struct
diatas Custumer
di setiap atribut bagian paling kanan terdapat tulisan seperti json:"first_name"
. Ini yang disebut dengan Tags Reflection yang mana ini ketika kita mau melakukan konversi dari struct Customer
maka atribute pada FirstName
penamaan-nya tidak FirstName
(PascalCase) tetapi ketika sudah menjadi JSON maka akan mengikuti tags-nya yaitu nama atributnya first_name
(snake_case).
Cara Implementasi
Kita akan coba membuat satu fungsi yang mana ini bisa kita gunakan fungsi pada pertemuan sebelumnya yaitu pada json
func GenerateobjekJSON(data Customer) string {
bytes, err := json.Marshal(data)
if err != nil {
panic(err)
}
return string(bytes)
}
Fungsi ini akan kita coba kembali untuk melakukan konversi dari struct menjadi type JSON. Langsung saja kepada unit test akan terlihat 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)
}
})
}
}
Terlihat bahwa hasil dari kita melakukan konversi struct Customer
menjadi JSON itu pada atribut-atribut ini
FirstName
menjadifirst_name
pada tipe JSONMiddleName
menjadimiddle_name
LastName
menjadilast_name
, danHobies
menjadihobbies
Begitupun ketika kita mengubah tags yang berbeda sekali itu tidak masalah asalkan sesuai dengan kaidah type JSON sehingga bisa dipahami oleh Frontend atau pengguna JSON tersebut.
Ketika menggunakan tags tersebut pastikan tipe JSON yang akan kita provide sama misalkan camelCase, snake_case ataupun type style yang lain agar pengguna yang akan menerima JSON ini tidak kesusahan dalam melakukan decode.