pemrograman

Golang JSON 06 Mengenal JSON Tags

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 menjadi first_name pada tipe JSON
  • MiddleName menjadi middle_name
  • LastName menjadi last_name, dan
  • Hobies menjadi hobbies

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.
comments powered by Disqus