119. Pengenalan Package encoding/json
Manipulasi data format JSON (JavaScript Object Notation) di Golang.
Package encoding/json
JSON adalah format standar pertukaran data pada RESTful API. Go menyediakan package bawaan encoding/json untuk konversi data Go ke/dari JSON.
| Tipe Data JSON | Pemetaan Tipe Data Go |
|---|---|
| String | string |
| Number | int, float64, int64 |
| Boolean | bool |
| Object | struct / map[string]interface{} |
| Array | slice / array ([]T) |
| Null | nil / pointer |
Contoh program
package main
import (
"encoding/json"
"fmt"
)
func main() {
fmt.Println("=== PACKAGE ENCODING/JSON ===")
fmt.Println("Package bawaan Go untuk Marshalling (Encode) dan Unmarshalling (Decode) data JSON.")
_ = json.Marshal
}
120. Encode JSON (json.Marshal)
Mengubah tipe data Golang (String, Int, Struct, Map) menjadi data JSON ([]byte).
json.Marshal()
name := "Eko Kurniawan" jsonBytes, err := json.Marshal(name) fmt.Println(string(jsonBytes)) // "Eko Kurniawan"
Contoh program
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]interface{}{
"name": "Golang JSON",
"version": 1.18,
"is_active": true,
}
jsonBytes, _ := json.Marshal(data)
fmt.Println("Hasil JSON Marshal:")
fmt.Println(string(jsonBytes))
}
121. JSON Objects & Struct Mapping
Mengonversi Struct Go menjadi JSON Object dan aturan Exported Field (Capital Letter).
Struct to JSON Object
Field pada Struct WAJIB diawali Huruf Kapital (Public/Exported). Field yang diawali huruf kecil (private) akan diabaikan oleh encoder JSON!
type Customer struct {
Name string // Terbaca oleh JSON
age int // DIABAIKAN (karena huruf kecil)
}
Contoh program
package main
import (
"encoding/json"
"fmt"
)
type Product struct {
ID string
Name string
Price int
}
func main() {
p := Product{ID: "P-01", Name: "Laptop Go", Price: 15000000}
jsonBytes, _ := json.Marshal(p)
fmt.Println("JSON Object Output:")
fmt.Println(string(jsonBytes))
}
122. Decode JSON (json.Unmarshal)
Mengonversi teks JSON (bytes/string) kembali menjadi objek Struct Go.
json.Unmarshal()
jsonString := `{"Name":"Budi","Price":5000}`
jsonBytes := []byte(jsonString)
var product Product
err := json.Unmarshal(jsonBytes, &product) // Wajib menggunakan Pointer &
Contoh program
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Email string
}
func main() {
jsonStr := `{"Name":"Eko Khannedy","Email":"[email protected]"}`
var u User
json.Unmarshal([]byte(jsonStr), &u)
fmt.Printf("Decoded Go Struct: Name=%s, Email=%s
", u.Name, u.Email)
}
123. JSON Array & Slices Mapping
Pengolahan data JSON Array ([...]) ke/dari Go Slices ([]T).
JSON Array Mapping
jsonArray := `["Java", "Go", "Python"]` var languages []string json.Unmarshal([]byte(jsonArray), &languages)
Contoh program
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonArr := `[{"Name":"Eko"},{"Name":"Budi"}]`
type Person struct { Name string }
var people []Person
json.Unmarshal([]byte(jsonArr), &people)
fmt.Println("Total Data Decoded:", len(people))
for i, p := range people {
fmt.Printf("Person %d: %s
", i+1, p.Name)
}
}
124. Custom JSON Tags (json:"name,omitempty")
Kustomisasi nama key JSON, mengabaikan field (json:"-"), dan opsi omitempty.
Tag Struct JSON
type Product struct {
ID string `json:"id"` // Ubah key ke "id"
Name string `json:"product_name"` // Ubah key ke "product_name"
Price int `json:"price,omitempty"` // Sembunyikan jika 0
Secret string `json:"-"` // Selalu abaikan field ini
}
Contoh program
package main
import (
"encoding/json"
"fmt"
)
type Customer struct {
FullName string `json:"full_name"`
Discount int `json:"discount,omitempty"`
Password string `json:"-"`
}
func main() {
c := Customer{FullName: "Budi Santoso", Password: "supersecretpassword"}
jsonBytes, _ := json.Marshal(c)
fmt.Println("Output JSON dengan Tag Kustom:")
fmt.Println(string(jsonBytes))
}
125. Dynamic JSON Mapping dengan map[string]interface{}
Menangani skema data JSON fleksibel tanpa membuat Struct khusus.
Dynamic JSON dengan Map
Jika struktur JSON tidak pasti atau berubah-ubah, kita bisa menggunakan map[string]interface{}:
var result map[string]interface{}
json.Unmarshal(jsonBytes, &result)
Contoh program
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"title":"Go Dynamic","stats":{"views":1500,"likes":200}}`
var data map[string]interface{}
json.Unmarshal([]byte(jsonStr), &data)
fmt.Println("Title:", data["title"])
stats := data["stats"].(map[string]interface{})
fmt.Println("Views:", stats["views"])
}
126. Streaming JSON Decoder (json.NewDecoder)
Membaca dan memproses JSON langsung dari Stream (io.Reader / HTTP Body).
json.NewDecoder
decoder := json.NewDecoder(r.Body) var user User err := decoder.Decode(&user)
Lebih hemat memori daripada membaca seluruh body ke []byte via io.ReadAll lalu memanggil json.Unmarshal.
Contoh program
package main
import (
"encoding/json"
"fmt"
"strings"
)
type Event struct {
Name string
}
func main() {
reader := strings.NewReader(`{"Name":"Go Workshop 2026"}`)
decoder := json.NewDecoder(reader)
var ev Event
decoder.Decode(&ev)
fmt.Println("Decoded Event Name via Stream Decoder:", ev.Name)
}
127. Streaming JSON Encoder (json.NewEncoder)
Menulis data JSON langsung ke Stream output (io.Writer / ResponseWriter).
json.NewEncoder
encoder := json.NewEncoder(w) encoder.Encode(responseData)
Di dalam HTTP handler, langsung teruskan http.ResponseWriter ke json.NewEncoder(w).Encode(data).
Contoh program
package main
import (
"bytes"
"encoding/json"
"fmt"
)
type Response struct {
Status string `json:"status"`
Code int `json:"code"`
}
func main() {
var buf bytes.Buffer
encoder := json.NewEncoder(&buf)
res := Response{Status: "SUCCESS", Code: 200}
encoder.Encode(res)
fmt.Println("==================================================")
fmt.Println(" SELAMAT! ANDA TELAH MENYELESAIKAN 161 BAB GOLANG ")
fmt.Println("==================================================")
fmt.Println("Hasil Encoder Stream Output:")
fmt.Print(buf.String())
}