A7 · JSON Yapısı: object, array: JSON, verinin **iç içe geçen kutular sistemidir**: bir **object** `{}` etiketli bir kutudur (anahtar→değer), bir **array** `[]` sıralı bir raftır
JSON, verinin **iç içe geçen kutular sistemidir**: bir **object** `{}` etiketli bir kutudur (anahtar→değer), bir **array** `[]` sıralı bir raftır (aynı tip kutular yan yana), **nested** yapı kutunun içindeki kutudur, ve iki sinsi durum vardır — `null` (kutu var ama içi boş) ile **alan yokluğu** (kutu hiç yok). Peki `null` ile "alan hiç yok" aynı şey değil mi, ikisi de "değer yok" demiyor mu? Hayır, ve bu fark bir testerın en çok yanıldığı yerdir: `"reporter": null` sunucunun "bilerek boş bıraktım" demesidir; alanın hiç olmaması ise "bu alanı unuttum/kaldırdım" olabilir — biri veri, diğeri contract kırılması. Java'da bunun karşılığı `Optional reporter = Optional.empty()` (null, bilinçli boş) ile alanın DTO'da hiç olmaması (deserialization'da sessizce atlanır) farkıdır. QA açısından kritik: `if (bug.reporter)` gibi bir kontrol hem `null` hem "yok" durumunda false verir ama bir contract testi ikisini AYIRMALIDIR — çünkü "alan null döndü" bir veri durumu, "alan tamamen kayboldu" ise bir API regresyonudur.
Bir Bug Kaydının JSON Anatomisi
🎬 null mı, Yok mu? Bir Alanın Sessiz Kayboluşu
İki farklı response: birinde `reporter: null`, diğerinde reporter alanı HİÇ yok. Gözle bakınca ikisi de "boş" görünür.
Zayıf bir test `if (bug.reporter)` yazar. Bu kontrol HER İKİ durumda da false verir — yani ikisini AYIRAMAZ.
Sonuç — Alan bir gün sessizce kaybolursa (API regresyonu) bu zayıf test hâlâ yeşil verir. Bug fark edilmez.
Güçlü bir contract testi ise "reporter anahtarı VAR MI?" diye ayrı sorar — null bir veri durumu, "anahtar yok" bir regresyondur.
Ders — null ("var ama boş") ile alan yokluğu ("hiç yok") farklıdır. Contract testleri anahtarın VARLIĞINI ayrıca doğrular.
Nested Veriye Güvenle Erişmek
assignee bir object…
bug.assignee.name'e erişmek için önce assignee'nin var olduğundan emin ol; assignee null ise bu erişim patlar.
null nested = çökme…
assignee null iken .name okumak "cannot read property of null" hatası verir — Java'daki NullPointerException'ın JS karşılığı.