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) // 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ı 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
Moviestruct'ı oluştur:Title(string),"title"ile eşlenirDirector(string),"director"ile eşlenirYear(int),"year"ile eşlenirRating(float64), derecelendirilmemiş filmlerin rating alanı göstermemesi için"rating"ile eşleniromitempty(string),InternalIDkullanı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ıranToJSON(m Movie) stringişlevini oluştur.FromJSON(jsonStr string) Movie: Her iki yönde JSON dönüşümünü göster.Bir işlem türü (
main.goveyaencode) oku.decodeiçin: Film ayrıntılarını (title, director, year, rating) ayrı satırlarda oku.encodedeğeri"internal-123"olan bir Movie oluştur, bunu JSON'a dönüştür ve sonucu yazdır.decodeiç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/Ayazdır.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: İşlem türü (
encodeveyadecode) - 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/AKendin 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 PoolKendi başına pratik yap: Online Go derleyicisi