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) // BobYaygı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.
Görev
KolayGo 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
Moviestruct'ı oluşturun:Title(string),"title"ile eşleşirDirector(string),"director"ile eşleşirYear(int),"year"ile eşleşirRating(float64),"rating"ile eşleşir veomitemptykullanılarak derecelendirilmemiş filmlerin bir rating alanı göstermemesi sağlanırInternalID(string),"-"kullanılarak JSON'dan tamamen hariç tutulmalıdır
Bir Movie'yi JSON string'ine dönüştüren bir
ToJSON(m Movie) stringfonksiyonu oluşturun. Ayrıca bir JSON string'ini tekrar bir Movie struct'ına ayrıştıranFromJSON(jsonStr string) Moviefonksiyonunu oluşturun.main.go: JSON dönüşümünü her iki yönde de gösterin.Bir işlem türü (
encodeveyadecode) okuyun.encodeiç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.decodeiç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/Ayazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: İşlem türü (
encodeveyadecode) - 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.6Ve ş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/AKopya 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) // BobStruct 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
}
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı11Standart Kütüphane ve OOP
io.Reader ve io.Writersort.Interface Arayüzüfmt.Stringer ArayüzüStruct'lar ile encoding/jsonhttp.Handler ArayüzüÖzet - REST API Modelleri3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool