Menu
CoddyTech

encoding/json dengan Struct

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 76 dari 107.

Package encoding/json memungkinkan kamu mengonversi struct Go ke JSON dan sebaliknya. Ini penting untuk API, file konfigurasi, dan penyimpanan data. Tag struct mengatur pemetaan field ke kunci JSON.

Untuk mengonversi struct menjadi JSON, gunakan json.Marshal:

type User struct {
    Name  string `json:"name"`
    Email string `json:"email"`
    Age   int    `json:"age"`
}

func main() {
    user := User{Name: "Alice", Email: "alice@example.com", Age: 30}
    data, _ := json.Marshal(user)
    fmt.Println(string(data))
    // {"name":"Alice","email":"alice@example.com","age":30}
}

Tag struct seperti `json:"name"` menentukan nama key JSON. Tanpa tag, Go menggunakan nama field secara langsung. Hanya field yang diekspor (diawali huruf kapital) yang disertakan dalam output JSON.

Untuk mengonversi JSON kembali menjadi struct, gunakan json.Unmarshal:

jsonStr := `{"name":"Bob","email":"bob@example.com","age":25}`
var user User
json.Unmarshal([]byte(jsonStr), &user)
fmt.Println(user.Name)  // Bob

Opsi tag yang umum mencakup omitempty untuk melewati nilai nol dan - untuk mengabaikan seluruh field:

type Product struct {
    ID       int    `json:"id"`
    Name     string `json:"name"`
    Price    float64 `json:"price,omitempty"`
    Internal string `json:"-"`
}

Dengan omitempty, jika Price bernilai nol, field tersebut tidak akan muncul dalam JSON. Field Internal tidak pernah disertakan, apa pun nilainya.

challenge icon

Tantangan

Mudah

Mari kita buat sistem katalog film yang mengonversi antara struct Go dan JSON! Kamu akan berlatih melakukan marshaling struct ke JSON dan unmarshaling JSON kembali menjadi struct, menggunakan tag struct untuk mengatur nama field JSON.

Kamu akan mengatur kodemu dalam dua file:

  • movie.go: Definisikan model data film dengan tag JSON yang sesuai.

    Buat struct Movie dengan field dan pemetaan JSON berikut:

    • Title (string) dipetakan ke "title"
    • Director (string) dipetakan ke "director"
    • Year (int) dipetakan ke "year"
    • Rating (float64) dipetakan ke "rating" dengan omitempty agar film yang belum memiliki rating tidak menampilkan field rating
    • InternalID (string) harus sepenuhnya dikecualikan dari JSON menggunakan "-"

    Buat fungsi ToJSON(m Movie) string yang mengonversi Movie menjadi string JSON. Buat juga FromJSON(jsonStr string) Movie yang mengurai string JSON kembali menjadi struct Movie.

  • main.go: Tunjukkan konversi JSON dalam kedua arah.

    Baca tipe operasi (encode atau decode).

    Untuk encode: Baca detail film (title, director, year, rating) pada baris terpisah. Buat Movie dengan InternalID bernilai "internal-123", konversikan menjadi JSON, lalu cetak hasilnya.

    Untuk decode: Baca string JSON, konversikan menjadi struct Movie, lalu cetak detail film dalam format ini:

    Title: [title]
    Director: [director]
    Year: [year]
    Rating: [rating]

    Tampilkan rating dengan satu angka desimal. Jika rating bernilai 0 (tidak ada di JSON), cetak Rating: N/A.

Input berikut akan diberikan:

  • Baris 1: Tipe operasi (encode atau decode)
  • Untuk encode: title, director, year, rating (empat baris)
  • Untuk decode: string JSON (satu baris)

Contohnya, jika diberikan:

encode
Inception
Christopher Nolan
2010
8.8

Outputmu seharusnya:

{"title":"Inception","director":"Christopher Nolan","year":2010,"rating":8.8}

Perhatikan bahwa InternalID tidak muncul dalam output karena tag "-".

Jika diberikan:

encode
The Matrix
Wachowskis
1999
0

Outputmu seharusnya:

{"title":"The Matrix","director":"Wachowskis","year":1999}

Perhatikan bahwa rating tidak disertakan karena nilainya nol dan memiliki omitempty.

Jika diberikan:

decode
{"title":"Interstellar","director":"Christopher Nolan","year":2014,"rating":8.6}

Outputmu seharusnya:

Title: Interstellar
Director: Christopher Nolan
Year: 2014
Rating: 8.6

Jika diberikan:

decode
{"title":"Tenet","director":"Christopher Nolan","year":2020}

Outputmu seharusnya:

Title: Tenet
Director: Christopher Nolan
Year: 2020
Rating: N/A

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Baca jenis operasi
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	if operation == "encode" {
		// Baca detail film
		title, _ := reader.ReadString('\n')
		title = strings.TrimSpace(title)

		director, _ := reader.ReadString('\n')
		director = strings.TrimSpace(director)

		yearStr, _ := reader.ReadString('\n')
		yearStr = strings.TrimSpace(yearStr)
		year, _ := strconv.Atoi(yearStr)

		ratingStr, _ := reader.ReadString('\n')
		ratingStr = strings.TrimSpace(ratingStr)
		rating, _ := strconv.ParseFloat(ratingStr, 64)

		// TODO: Buat struct Movie dengan nilai yang dibaca
		// Atur InternalID ke "internal-123"
		// Ubah menjadi JSON menggunakan ToJSON, lalu cetak hasilnya

	} else if operation == "decode" {
		// Baca string JSON
		jsonStr, _ := reader.ReadString('\n')
		jsonStr = strings.TrimSpace(jsonStr)

		// TODO: Ubah JSON menjadi Movie menggunakan FromJSON
		// Cetak detail film dalam format yang diminta
		// Gunakan fmt.Sprintf("%.1f", rating) untuk memformat rating
		// Jika rating bernilai 0, cetak "Rating: N/A" sebagai gantinya

	}
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online