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
Was this helpful?