JSON Data

JSON atau Javascript Object Notation adalah notasi standar yang umum digunakan untuk komunikasi data di dalam web.

Go menyediakan package encoding/json yang berisikan banyak fungsi untuk kebutuhan operasi dan manipulasi json.

Decode JSON ke Struct

Kita akan melakukan decode dari data JSON ke dalam Struct.

Terdapat data JSON dengan nilai berikut:

jsonString := `{"Name": "David Winalda", "Age": 27}`

Lalu kita juga akan membuat struct bernama User yang memiliki 2 properti

type User struct {
	FullName string `json:"Name"`
	Age      int
}

Untuk melakukan decode, kita akan menggunakan fungsi dari package json yaitu json.Unmarshal yang membutuhkan 2 parameter. Parameter pertama adalah data JSON yang harus bertipe []byte . Oleh karena itu nantinya kita harus melakukan casting dari data JSON berbentuk string ke dalam []byte . Parameter kedua adalah pointer dari struct yang akan menampung hasilnya.

jsonData := []byte(jsonString)

var user User

err := json.Unmarshal(jsonData, &user)

Kode lengkapnya dapat dilihat di bawah ini:

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	FullName string `json:"Name"`
	Age      int
}

func main() {
	jsonString := `{"Name": "David Winalda", "Age": 27}`
	jsonData := []byte(jsonString)

	var user User

	err := json.Unmarshal(jsonData, &user)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println("User:", user.FullName)
	fmt.Println("Age:", user.Age)
}

Jika dilihat, ada yang berbeda pada struct yang telah kita buat. Pada struct User, salah satu property-nya yaitu FullName memiliki tag json:"Name". Tag tersebut digunakan untuk mapping informasi json ke property yang bersangkutan.

Data json yang akan diparsing memiliki 2 property yaitu Name dan Age. Kebetulan penulisan Age pada data json dan pada struktur struct adalah sama, berbeda dengan Name yang tidak ada pada struct.

Dengan menambahkan tag json, maka property FullName struct akan secara otomatis menampung data json property Name.

Decode JSON ke Map dan Interface

Kita juga bisa melakukan decode dari JSON ke dalam map[string]interface{} dan interface{} .

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	jsonString := `{"Name": "David Winalda", "Age": 27}`
	jsonData := []byte(jsonString)

	var user map[string]interface{}

	err := json.Unmarshal(jsonData, &user)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println("User:", user["Name"])
	fmt.Println("Age:", user["Age"])
}
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	jsonString := `{"Name": "David Winalda", "Age": 27}`
	jsonData := []byte(jsonString)

	var user interface{}

	err := json.Unmarshal(jsonData, &user)

	decodedData := user.(map[string]interface{})

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println("User:", decodedData["Name"])
	fmt.Println("Age:", decodedData["Age"])
}

Untuk melakukan decode dari ke data interface{} , kita harus melakukan casting ke dalam map[string]interface{} seperti berikut ini:

decodedData := user.(map[string]interface{})

Encode Slice Struct ke dalam JSON

Sebelumnya kita sudah melakukan decode data dari JSON, sekarang kita akan membahas cara encode data slice struct ke bentuk JSON.

Fungsi json.Marshal digunakan untuk encoding data ke JSON. Sumber data bisa berupa variabel dengan tipe data struct, map[string]interface{}, atau slice.

Pada contoh berikut, data slice struct dikonversi ke dalam bentuk JSON. Hasil konversi berupa []byte, maka akan kita casting terlebih dahulu ke tipe string untuk bisa ditampilkan bentuk JSON string-nya.

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Fullname string
	Age      int
}

func main() {
	data := []User{{"David Winalda", 26}, {"Vennika Qashash", 25}}
	jsonData, err := json.Marshal(data)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	jsonString := string(jsonData)
	fmt.Println(jsonString)
}

Last updated