Menu
Coddy logo textTech

Struct'lar ile encoding/json

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 76 / 107.

encoding/json paketi, Go struct'larını JSON'a ve JSON'dan geri dönüştürmenize olanak tanır. Bu; API'ler, yapılandırma dosyaları ve veri depolama için gereklidir. Struct etiketleri, alanların JSON anahtarlarıyla nasıl eşleşeceğini kontrol eder.

Bir struct'ı JSON'a dönüştürmek için json.Marshal kullanın:

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

`json:"name"` gibi struct etiketleri JSON anahtar adlarını belirtir. Etiketler olmadan, Go doğrudan alan adını kullanır. JSON çıktısına yalnızca dışa aktarılan (büyük harfle başlayan) alanlar dahil edilir.

JSON'ı tekrar bir struct'a dönüştürmek için json.Unmarshal kullanın:

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

Yaygın etiket seçenekleri, sıfır değerleri atlamak için omitempty ve bir alanı tamamen yok saymak için - seçeneğini içerir:

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

omitempty ile, eğer Price sıfır ise JSON'da görünmeyecektir. Internal alanı, değerine bakılmaksızın asla dahil edilmez.

challenge icon

Görev

Kolay

Go struct'ları ile JSON arasında dönüşüm yapan bir film katalog sistemi kuralım! JSON alan adlarını kontrol etmek için struct tag'lerini kullanarak, struct'ları JSON'a dönüştürme (marshaling) ve JSON'u tekrar struct'lara dönüştürme (unmarshaling) pratikleri yapacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • movie.go: Film veri modelinizi uygun JSON tag'leri ile tanımlayın.

    Aşağıdaki alanlara ve JSON eşleşmelerine sahip bir Movie struct'ı oluşturun:

    • Title (string), "title" ile eşleşir
    • Director (string), "director" ile eşleşir
    • Year (int), "year" ile eşleşir
    • Rating (float64), "rating" ile eşleşir ve omitempty kullanılarak derecelendirilmemiş filmlerin bir rating alanı göstermemesi sağlanır
    • InternalID (string), "-" kullanılarak JSON'dan tamamen hariç tutulmalıdır

    Bir Movie'yi JSON string'ine dönüştüren bir ToJSON(m Movie) string fonksiyonu oluşturun. Ayrıca bir JSON string'ini tekrar bir Movie struct'ına ayrıştıran FromJSON(jsonStr string) Movie fonksiyonunu oluşturun.

  • main.go: JSON dönüşümünü her iki yönde de gösterin.

    Bir işlem türü (encode veya decode) okuyun.

    encode için: Film detaylarını (title, director, year, rating) ayrı satırlarda okuyun. InternalID değeri "internal-123" olan bir Movie oluşturun, bunu JSON'a dönüştürün ve sonucu yazdırın.

    decode için: Bir JSON string'i okuyun, bunu bir Movie struct'ına dönüştürün ve film detaylarını şu formatta yazdırın:

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

    Rating değerini bir ondalık basamakla görüntüleyin. Eğer rating 0 ise (JSON'da mevcut değilse), bunun yerine Rating: N/A yazdırın.

Aşağıdaki girdiler sağlanacaktır:

  • Satır 1: İşlem türü (encode veya decode)
  • encode için: title, director, year, rating (dört satır)
  • decode için: bir JSON string (tek satır)

Örneğin, şu girdi verildiğinde:

encode
Inception
Christopher Nolan
2010
8.8

Çıktınız şu olmalıdır:

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

"-" tag'i nedeniyle InternalID'nin çıktıda görünmediğine dikkat edin.

Ve şu girdi verildiğinde:

encode
The Matrix
Wachowskis
1999
0

Çıktınız şu olmalıdır:

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

rating değeri sıfır olduğu ve omitempty tag'ine sahip olduğu için atlandığına dikkat edin.

Ve şu girdi verildiğinde:

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

Çıktınız şu olmalıdır:

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

Ve şu girdi verildiğinde:

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

Çıktınız şu olmalıdır:

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

Kopya kağıdı

encoding/json paketi, json.Marshal ve json.Unmarshal kullanarak Go struct'larını JSON'a ve tam tersine dönüştürür.

Bir struct'ı JSON'a dönüştürmek için:

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

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}

JSON'u tekrar bir struct'a dönüştürmek için:

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

Struct etiketleri (tags), JSON alan eşlemesini kontrol eder:

  • `json:"name"` - alanı "name" JSON anahtarına eşler
  • `json:"price,omitempty"` - değer sıfırsa alanı atlar
  • `json:"-"` - alanı JSON'dan tamamen hariç tutar
type Product struct {
    ID       int     `json:"id"`
    Name     string  `json:"name"`
    Price    float64 `json:"price,omitempty"`
    Internal string  `json:"-"`
}

JSON çıktısına yalnızca dışa aktarılan (büyük harfle başlayan) alanlar dahil edilir.

Kendin dene

package main

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

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

	// İşlem türünü oku
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	if operation == "encode" {
		// Film detaylarını oku
		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: Okunan değerlerle bir Movie struct'ı oluşturun
		// InternalID değerini "internal-123" olarak ayarlayın
		// ToJSON kullanarak JSON'a dönüştürün ve sonucu yazdırın

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

		// TODO: FromJSON kullanarak JSON'ı Movie'ye dönüştürün
		// Film detaylarını istenen formatta yazdırın
		// Derecelendirme formatlaması için fmt.Sprintf("%.1f", rating) kullanın
		// Eğer rating 0 ise, bunun yerine "Rating: N/A" yazdırın

	}
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler