programming

09 How To Use Streaming Encoder

Introduction to Stream Encoders

Apart from JSON Decoder, this JSON package can also support Encoder which is used directly JSON into io.Writer. So that way we don’t need to store the JSON data first into a string or []byte variable, so we can just write it directly into io.Writer.

If we want to make an Encoder then we can use a function

json.NewEncoder(writer)

And to write data as JSON directly as a writer we need to use a function

Encode(interface{})

Use of Stream Encoder

So, let’s try straight away how to create a JSON Encoder stream. First, we need to create a function like the one below.

func EncoderStreaWriterJSON(cust Customer) {
	writer, _ := os.Create("sample_output.json")
	encoder := json.NewEncoder(writer)

	err := encoder.Encode(cust)
	if err != nil {
		panic(err)
	}
}

In the function above, we will receive data from the Customer struct parameter, then we will save the data in the sample_output.json file and at the same time fill in the data in it in the form of a json file too.

To ensure that the function runs well, we need to create a unit test on the function. Below are the tests (unit tests) that we have to create.

func TestEncoderStreamWriterJSON(t *testing.T) {
	type args struct {
		cust Customer
	}
	tests := []struct {
		name string
		args args
		want Customer
	}{
		{
			name: "success encode strem reader",
			args: args{
				cust: Customer{
					FirstName:  "Santekno",
					MiddleName: "Ihsan",
					LastName:   "Arif",
					Hobbies:    []string{"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) {
			EncoderStreaWriterJSON(tt.args.cust)

			reader, _ := os.Open("sample_output.json")
			decoder := json.NewDecoder(reader)

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

			if !reflect.DeepEqual(cust, tt.want) {
				t.Errorf("EncoderStreaWriterJSON() = %v, want %v", cust, tt.want)
			}
		})
	}
}

In the unit test, we add a Decoder so that we ensure that the contents of the Encoder result file match those sent from the parameters, so we modify the unit test above a little so that we can do a deeper check on the format of the JSON data contents.

comments powered by Disqus