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?