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