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 yapılarını JSON'a ve JSON'dan Go yapılarına dönüştürmenizi sağlar. Bu, API'ler, yapılandırma dosyaları ve veri depolama için gereklidir. Yapı 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 yapı etiketleri JSON anahtar adlarını belirtir. Etiketler olmadan Go, alan adını doğrudan kullanır. JSON çıktısına yalnızca dışa aktarılan alanlar (büyük harfle başlayanlar) dahil edilir.

JSON'u tekrar bir yapıya 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ı ve JSON arasında dönüşüm yapan bir film kataloğu sistemi oluşturalım! Struct'ları JSON'a marshaling ve JSON'ı tekrar struct'lara unmarshaling işlemlerini uygulayacak, JSON alan adlarını kontrol etmek için struct tag'lerini kullanacaksın.

Kodunu iki dosyaya ayıracaksın:

  • movie.go: Uygun JSON tag'leriyle film veri modelini tanımla.

    Aşağıdaki alanlara ve JSON eşlemelerine sahip bir Movie struct'ı oluştur:

    • Title (string), "title" ile eşlenir
    • Director (string), "director" ile eşlenir
    • Year (int), "year" ile eşlenir
    • Rating (float64), derecelendirilmemiş filmlerin rating alanı göstermemesi için "rating" ile eşlenir
    • omitempty (string), InternalID kullanılarak JSON'dan tamamen hariç tutulmalıdır

    Bir Movie'yi JSON string'ine dönüştüren "-" işlevini oluştur. Ayrıca bir JSON string'ini tekrar bir Movie struct'ına ayrıştıran ToJSON(m Movie) string işlevini oluştur.

  • FromJSON(jsonStr string) Movie: Her iki yönde JSON dönüşümünü göster.

    Bir işlem türü (main.go veya encode) oku.

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

    decode için: Bir JSON string'i oku, bunu bir Movie struct'ına dönüştür ve film ayrıntılarını şu biçimde yazdır:

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

    Rating değerini bir ondalık basamakla göster. Rating 0 ise (JSON'da mevcut değilse) bunun yerine Rating: N/A yazdır.

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

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

Örneğin, şu verildiğinde:

encode
Inception
Christopher Nolan
2010
8.8

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

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

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

Şu verildiğinde:

encode
The Matrix
Wachowskis
1999
0

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

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

rating değerinin 0 olduğu ve omitempty içerdiği için atlandığına dikkat et.

Şu verildiğinde:

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

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

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

Şu verildiğinde:

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

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

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

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

Kendi başına pratik yap: Online Go derleyicisi