JSON'dan Go Struct'a
JSON'dan Go struct'ları oluşturun
JSON Girişi
Go Çıktısı
JSON'dan Go Struct'a Dönüşüm Nedir?
JSON'dan Go'ya dönüşüm, ham JSON verisini Go'nun standart kütüphanesindeki encoding/json paketiyle uyumlu Go tür tanımlarına dönüştürme işlemidir. Go statik türlendirilmiş bir dil olduğundan her JSON alanının, doğru türe sahip ve serileştiriciye hangi JSON anahtarıyla eşleşeceğini belirten bir struct etiketi içeren bir struct alanına karşılık gelmesi gerekir. Büyük veya derin iç içe API yanıtları için bu tanımları elle yazmak hem yavaş hem de hata yapmaya açıktır.
Go 1.0'dan bu yana Go belirtiminde yer alan encoding/json paketi, JSON anahtarlarını dışa aktarılmış struct alanlarıyla eşleştirmek için yansıma kullanır. Eşleştirme varsayılan olarak büyük/küçük harf duyarlı değildir; ancak açık json struct etiketleri, belirsizliği ortadan kaldırdığı ve JSON camelCase veya snake_case biçiminde kalırken Go'nun PascalCase kuralını kullanmanıza olanak tanıdığı için standart pratiktir. Bir dönüştürücü bunu otomatikleştirir: JSON'unuzu okur, değerlerden Go türlerini çıkarsar ve doğru etiketlere sahip struct tanımları üretir.
Go'nun tür sistemi JSON ile birebir örtüşür. Dizgeler string, boolean'lar bool, tam sayılar int ve ondalıklı sayılar float64 olur. İç içe JSON nesneleri ayrı adlandırılmış struct'lara, diziler ise dilim'e (slice) dönüşür. Tek eksik nokta null'dır: Go'nun evrensel bir null olabilir türü olmadığından null değerler genellikle işaretçi türlerine (*string, *int) veya interface{}'ye dönüşür. Bir üretici tüm bunları milisaniyeler içinde halleder.
Neden JSON'dan Go Dönüştürücüsü Kullanmalısınız?
JSON'dan Go struct'larını elle tanımlamak; parantez saymak, türleri tahmin etmek ve API her değiştiğinde etiketleri yeniden yazmak anlamına gelir. Bir dönüştürücü bu engeli ortadan kaldırır.
JSON'dan Go Struct'a Kullanım Senaryoları
JSON'dan Go'ya Tür Eşleme
encoding/json paketi, JSON değerlerini Go türlerine eşlerken belirli kurallar izler. Aşağıdaki tablo varsayılan eşlemeyi ve yaygın alternatifleri göstermektedir. "Varsayılan" sütunu çoğu üreticinin ürettiği türdür. "Alternatif" sütunu, büyük kimlikler için int64 veya null olabilen alanlar için işaretçi türleri gibi gereksinimlerinize göre tercih edebileceğiniz türleri gösterir.
| JSON Türü | Örnek | Varsayılan | Alternatif |
|---|---|---|---|
| string | "hello" | string | string |
| number (integer) | 42 | int | int64 |
| number (float) | 3.14 | float64 | float64 |
| boolean | true | bool | bool |
| null | null | interface{} | *string / *int |
| object | {"k": "v"} | struct | struct |
| array of strings | ["a", "b"] | []string | []string |
| array of objects | [{"id": 1}] | []Item | []Item |
| mixed array | [1, "a"] | []interface{} | []interface{} |
Go JSON Struct Etiketi Başvurusu
Struct etiketleri, encoding/json'ın alanları nasıl serileştirip seri dışı bıraktığını denetler. json etiketi açık ara en yaygın olanıdır; ancak aynı alan üzerinde diğer etiketlerle (db, yaml, xml) birleştirilebilir. Etiket sözdizimi, alan türünden sonra gelen backtick sınırlı bir dizgedir. İşte encoding/json'ın desteklediği json etiketi seçenekleri.
| Etiket | Davranış | Kullanım Durumu |
|---|---|---|
| json:"name" | Maps struct field to JSON key "name" | Always generated |
| json:"name,omitempty" | Omits field from output if zero value | Optional fields |
| json:"-" | Field is never serialized or deserialized | Internal fields |
| json:"name,string" | Encodes int/bool as JSON string | String-encoded numbers |
json.Unmarshal ve json.NewDecoder
Go, JSON'ı çözümlemek için iki yol sunar: bayt dilimleri için json.Unmarshal ve io.Reader akışları için json.NewDecoder. Her ikisi de aynı struct etiketi kurallarını kullanır; ancak ne zaman tercih edileceği konusunda farklılaşırlar.
Kod Örnekleri
Bu örnekler, JSON'dan üretilen Go struct'larının gerçek programlarda nasıl kullanılacağını ve bunların diğer dillerden nasıl üretileceğini göstermektedir. Go örnekleri, standart kütüphaneden encoding/json kullanır.
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
IsActive bool `json:"is_active"`
Tags []string `json:"tags"`
}
func main() {
data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
panic(err)
}
fmt.Println(user.Name) // → Alice
fmt.Println(user.Tags) // → [admin editor]
}// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }
// Equivalent Go struct:
// type User struct {
// ID int `json:"id"`
// Name string `json:"name"`
// Email string `json:"email"`
// }import json
def json_to_go(data: dict, name: str = "Root") -> str:
lines = [f"type {name} struct {{"]
type_map = {str: "string", int: "int", float: "float64", bool: "bool"}
for key, value in data.items():
go_type = type_map.get(type(value), "interface{}")
field = key.title().replace("_", "") # snake_case → PascalCase
lines.append(f'\t{field} {go_type} `json:"{key}"`')
lines.append("}")
return "\n".join(lines)
data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
# UserName string `json:"user_name"`
# Age int `json:"age"`
# Verified bool `json:"verified"`
# }package main
import (
"encoding/json"
"fmt"
"strings"
)
type Event struct {
Type string `json:"type"`
Payload string `json:"payload"`
}
func main() {
stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)
dec := json.NewDecoder(stream)
for dec.More() {
var ev Event
if err := dec.Decode(&ev); err != nil {
break
}
fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
}
// → click: btn-1
// → scroll: page-2
}