JSON'dan tip ve class nasıl oluşturulur

Bir API için model tiplerini almanın en hızlı yolu onları gerçek bir yanıttan oluşturmaktır: JSON'u yapıştır, dilini seç ve kodu kopyala. Bir oluşturucu her değeri okur, metin mi, tam sayı mı, ondalıklı mı, tarih mi olduğuna karar verir ve iç içe nesneleri kendi tiplerine dönüştürür. Bu rehber, böyle bir aracın bir örnekten neyi bilip neyi bilemeyeceğini ve kod projene girmeden önce neleri kontrol etmen gerektiğini anlatıyor.

4 dk okuma

Tip oluşturmak neden işe yarar

Tipli modeller hataları erkenden yakalar. Bir API yanıtı bir interface ya da class ile tanımlandığında editörün alan adlarını tamamlar, derleyici yanlış yazılmış bir anahtarı fark eder, adı değişmiş bir alan da çalışma anında sessizce undefined ya da null dönmek yerine hata olarak karşına çıkar. Elli alanlı ve üç kat iç içe bir yanıt için bu tipleri elle yazmak hem zaman alır hem de hataya çok açıktır.

Bir oluşturucu bu tekrarlı işi bir saniyede yapar. Sonuç iyi bir ilk taslaktır; sen gözden geçirir, gereken yerleri yeniden adlandırır ve commit edersin. API değiştiğinde de yeni bir yanıtla tipleri birkaç saniyede yeniden oluşturup farkları kod karşılaştırma aracınla görebilirsin; elle yazılmış modellerde bu değişiklikler çoğu zaman gözden kaçar.

Burada dene: JSON'dan Kod Oluşturucu

Aracın tam sayfasını aç

Oluşturucu örneğinden neleri çıkarır

Her şey JSON'daki değerlerden gelir. Bu yüzden örneğin kalitesi her şeyden daha önemlidir. Aşağıdaki tablo, JSON'da gördüğü her değer için aracın hangi tipi seçtiğini gösteriyor.

JSON'daÇıkarılan tipÖrnek
Metinstring"name": "Ayşe"
Tam sayıint, 2.147.483.647 üstünde long"id": 42
Ondalık noktalı sayıdouble ya da float"price": 19.0
true ya da falseboolean"active": true
ISO tarih biçiminde metinaçıksa tarih tipi"created": "2026-10-27T09:30:00Z"
Bazı öğelerde nullnullable tip"phone": null
Bazı öğelerde olmayan anahtaristeğe bağlı alan"discount" sadece bir öğede
Nesneadı olan yeni bir tip"address": { ... }
Nesne listesibirleştirilmiş tek tipin listesi"items": [ { ... }, { ... } ]

Ona çeşitlilik içeren bir örnek ver

Bir oluşturucu sadece gördüğünü anlatabilir. Örneğinde tek kalemli tek bir sipariş varsa her alan zorunlu, hiçbir alan nullable görünmez. Bazılarında indirim olan, bazılarında olmayan bir sipariş listesi verirsen indirim alanı doğru şekilde isteğe bağlı olarak işaretlenir.

Bu yüzden tip oluşturmadan önce birkaç öğe içeren bir yanıt topla, mümkünse uç durumları da ekle: telefon numarası olmayan bir müşteri, kalemi olmayan bir sipariş, ondalıklı fiyatı olan bir ürün. Hepsini en üst düzeyde tek bir diziye koy; oluşturucu hepsini birleştirip her yapı için tek bir tip çıkarır. Örneğin eksik kaldığında şu durumlarla karşılaşırsın:

  • Her öğede null olan alanlar unknown, object ya da Any gibi genel bir tip alır, çünkü gerçek tip görünmez.
  • Boş listeler de aynı nedenle tipi bilinmeyen öğelerin listesi olur.
  • Bir öğede sayı, başka bir öğede metin olan alan TypeScript'te union, diğer dillerde genel bir tip olur.
  • Bazı veritabanı anahtarları gibi 2^53 üstündeki büyük ID'ler metin olarak daha güvenlidir. JavaScript onları sayı olarak tam gösteremez.

Adlar, attribute'lar ve dil kuralları

JSON anahtarları çoğu zaman sunucu tarafının stilini izler, örneğin Python ya da Ruby'den gelen snake_case; senin istemci kodun ise başka bir stil kullanır. İyi bir oluşturucu alanları hedef dilin kuralına göre yeniden adlandırır ve asıl anahtarı bir attribute içinde tutar, böylece serileştirme veriyle uyumlu kalır. Her dilde durum şöyle:

DilAlan adlarıJSON anahtarı nasıl korunur
TypeScriptDeğişmezGerekmez; alışılmadık anahtarlar tırnağa alınır
C#PascalCase[JsonPropertyName] ya da [JsonProperty]
Pythonsnake_casePydantic'te Field(alias=...)
GoDışa açık, ID ve URL ilejson:"key" struct tag'leri
JavacamelCase@JsonProperty (Jackson)
KotlincamelCase@SerialName (kotlinx.serialization)

Tipler doğrulama değildir

Bir TypeScript interface'i kod derlendiğinde ortadan kalkar. API, interface'in vaat ettiğinden farklı bir şey gönderirse çalışma anında hiçbir şey bunu durdurmaz. Çoğu dilde düz class'lar için de durum aynıdır: deserializer doldurabildiğini doldurur, gerisini boş bırakır.

Veri senin kontrolün dışından geliyorsa geldiği anda doğrula. Python'da Pydantic modelleri bunu kendiliğinden yapar; oluşturucuda bu stili seçmek için iyi bir neden. TypeScript'te veriyi çalışma anında kontrol eden kütüphanelerin şemaları oluşan interface'lerden yazılabilir. C#, Java ve Kotlin'de mutlaka olması gereken alanları zorunlu olarak işaretle ve serileştiricinin erkenden hata vermesine izin ver.

Commit etmeden önce kontrol listesi

Oluşan kodu projene eklemeden önce şu maddelerin üzerinden geç. Birkaç dakikalık kontrol, ileride saatler sürecek hata ayıklamayı önler.

  • En üstteki tipin adını Root'tan Order gibi anlamlı bir ada çevir.
  • unknown, object, Any ya da JsonElement tipli her alanı gözden geçir ve gerçek tipiyle değiştir.
  • Sayıları kontrol et: fiyat gerçekten double mı, yoksa para için decimal bir tip mi olmalı?
  • Tarihleri kontrol et: metin olarak mı, yoksa saat dilimi belli bir tarih tipi olarak mı istiyorsun?
  • Hangi isteğe bağlı alanların gerçekten isteğe bağlı olduğuna, hangilerinin örnekte sadece tesadüfen eksik kaldığına karar ver.
  • Örnekleri biraz farklı olduğu için oluşturucunun ayrı tuttuğu tipleri birleştir.

Adım adım

  1. Bir JSON yanıtı yapıştırAPI'nden gelen yanıtı yapıştır ya da .json dosyası aç. Birkaç öğeli bir liste daha iyi sonuç verir.
  2. Dili seçTypeScript, C#, Python, Go, Java ya da Kotlin'i, ardından record, dataclass ya da Pydantic gibi stili seç.
  3. En üstteki tipe ad verEn üstteki tipin adı alanındaki Root'u projende kullandığın adla değiştir, örneğin Order.
  4. Kopyala ve gözden geçirKodu kopyala ya da indir, sonra bu rehberdeki kontrol listesinin üzerinden geç.

Sık sorulan sorular

Tipleri JSON Schema'dan oluşturabilir miyim?

Bu araç şemadan değil, JSON verisinden çalışır. API'n bir JSON Schema ya da OpenAPI dosyası yayınlıyorsa şemaya dayalı bir oluşturucu daha kesin sonuç verir, çünkü şema neyin zorunlu olduğunu söyler.

TypeScript interface'imde bir alan neden isteğe bağlı?

Örneğindeki en az bir öğede bu anahtar yoktu. Gerçek veride her zaman varsa soru işaretini kaldır ya da örneğe eksiksiz bir öğe ekle.

Para double olmalı mı?

Parayla hesap yapılacaksa C#'taki decimal ya da Java'daki BigDecimal gibi ondalık bir tip yuvarlama hatalarını önler. Oluşturucu sadece ondalık noktalı bir sayı görür, bu yüzden tipi kendin değiştir.

Boşluk ya da tire içeren anahtarlara ne oluyor?

Her dilde geçerli adlara çevrilir, asıl anahtar bir attribute, tag ya da alias içinde tutulur. TypeScript'te anahtar sadece tırnağa alınır.

Burada kod oluştururken JSON'um yükleniyor mu?

Hayır. Oluşturucu tarayıcında çalışır, özel veri içeren yanıtlar cihazında kalır.