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