Kodeloka
  1. Kodeloka
  2. Kelas Golang
  3. Materi

Domain 9 · 9 bab

Golang JSON

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 JSONPemetaan Tipe Data Go
Stringstring
Numberint, float64, int64
Booleanbool
Objectstruct / map[string]interface{}
Arrayslice / array ([]T)
Nullnil / 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
}

Praktik dan kuis bab ini di kelas interaktif →

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))
}

Praktik dan kuis bab ini di kelas interaktif →

121. JSON Objects & Struct Mapping

Mengonversi Struct Go menjadi JSON Object dan aturan Exported Field (Capital Letter).

Struct to JSON Object

⚠️ Aturan Utama Exported Field:

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))
}

Praktik dan kuis bab ini di kelas interaktif →

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)
}

Praktik dan kuis bab ini di kelas interaktif →

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)
	}
}

Praktik dan kuis bab ini di kelas interaktif →

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))
}

Praktik dan kuis bab ini di kelas interaktif →

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"])
}

Praktik dan kuis bab ini di kelas interaktif →

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)
🚀 Keunggulan Stream:

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)
}

Praktik dan kuis bab ini di kelas interaktif →

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)
🏆 Praktik Terbaik REST API:

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())
}

Praktik dan kuis bab ini di kelas interaktif →