pemrograman

Golang JSON 08 Penggunaan Streaming Decoder

Pengenalan Stream Decoder

Pada artikel sebelumnya kita pernah belajar package JSON dengan menggunakan konversi data JSOn yang sudah dalam bentuk variabel dan data string atau kita pakai []byte. Kadang-kadang data JSON itu berasa dari input berupa io.Reader yaitu bisa dalam bentuk file, Network ataupun request body. Maka kita bisa saja langsung membaca semua data tersebut terlebih dahulu lalu simpan di dalam suatu variabel dan baru kita konversi dari JSON, namun ini kita tidak perlu melakukannya karena pada package JSON memiliki fitur untuk membaca data dari Stream.

Pada package JSON, jika kita ingin membuat JSON Decoder cukup kita menggunakan fungsi

json.NewDecoder(reader)

Selanjutnya untuk membaca input reader dan konversi secara langsung oleh Golang dengan menggunakan fungsi

json.Decode(interface)

Penggunaan Stream Decoder

Penggunaan JSON Decoder ini bisa kita contohkan pada file dibawah ini.

func DecodeStreamReaderJSON(file string) Customer {
	reader, _ := os.Open(file)
	decoder := json.NewDecoder(reader)

	var customer Customer
	err := decoder.Decode(&customer)
	if err != nil {
		panic(err)
	}
	return customer
}

Lalu kita siapkan file sample.json dengan isian data seperti dibawah ini.

{
  "first_name": "Santekno",
  "middle_name": "Ihsan",
  "last_name": "Arif",
  "hobbies": [
    "badminton",
    "renang",
    "coding"
  ]
}

Bisa kita lihat pada fungsi ConvertStreamReaderJSON ini pada baris pertama kita membaca file dengan nama yang dikirim oleh parameter, sehingga file tersebut bisa jadi bentuknya berbeda-beda, tetapi pada kasus ini kita mengambil data dari file dalam bentuk JSON agar lebih mudah.

Secara konsep mungkin ini sama seperti halnya mengkonversikan data tetapi bedanya yaitu data yang diambil dalam bentuk Stream yang mana kita perlu membaca isi file yang ada pada parameter yang dikirim. Sehingga ini sangat memudahkan kita ketika misalkan kita ingin mengambil data dalam bentuk file atau API yg mengirim JSON, maka kita tidak perlu dua kali konversi tetapi kita hanya satu kali saja konversi dengan memakai json.Decode ini.

Untuk menguji fungsi yang sudah kita buat, kita pastikan buat unit test seperti dibawah ini.

func TestDecodeStreamReaderJSON(t *testing.T) {
	type args struct {
		file string
	}
	tests := []struct {
		name string
		args args
		want Customer
	}{
		{
			name: "success convert stream reader",
			args: args{
				file: "sample.json",
			},
			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 := DecodeStreamReaderJSON(tt.args.file); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("DecodeStreamReaderJSON() = %v, want %v", got, tt.want)
			}
		})
	}
}
comments powered by Disqus