Java İle Json Veri Ayrıştırma Ve İşleme Süreci Nasıl Yapılır?

Java İle Json Veri Ayrıştırma Ve İşleme Süreci Nasıl Yapılır?
Java İle Json Veri Ayrıştırma Ve İşleme Süreci Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Java projelerinde JSON işlemleri için yerleşik bir kütüphane yerine, endüstri standardı olan güçlü kütüphaneleri kullanmak çok daha verimlidir. En çok tercih edilen seçenekler Jackson ve Gson kütüphaneleridir. Bu rehberde, Spring Boot projelerinde varsayılan olan ve yüksek performansıyla bilinen Jackson kütüphanesini temel alacağız.

Projenize Jackson kütüphanesini dahil etmek için Maven kullanıyorsanız pom.xml dosyanıza şu bağımlılıkları eklemelisiniz:


    com.fasterxml.jackson.core
    jackson-databind
    2.17.0

Bu bağımlılık, JSON verilerini ayrıştırmak ve Java nesneleri ile eşleştirmek için gerekli olan tüm araçları sağlar. Kurulumu tamamladıktan sonra IDE'nizin kütüphaneleri indirdiğinden emin olun.

Adım Adım JSON Verisini Java Nesnesine Dönüştürme

JSON verisini bir Java nesnesine dönüştürme işlemine "deserialization" denir. Bu işlem için öncelikle JSON yapısını karşılayacak bir POJO (Plain Old Java Object) sınıfı oluşturmalısınız. Aşağıdaki örnekte, bir kullanıcı verisini temsil eden basit bir sınıf yapısını görebilirsiniz.

public class Kullanici {
    public String isim;
    public int yas;
    public String email;
}

Şimdi, bir JSON string ifadesini bu sınıfa nasıl dönüştüreceğimizi inceleyelim. ObjectMapper sınıfı, Jackson kütüphanesinin merkezidir ve tüm dönüşüm işlemlerini yönetir.

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonIsleyici {
    public static void main(String[] args) throws Exception {
        String jsonVerisi = "{\"isim\":\"Ahmet\", \"yas\":30, \"email\":\"ahmet@example.com\"}";
        
        ObjectMapper mapper = new ObjectMapper();
        Kullanici kullanici = mapper.readValue(jsonVerisi, Kullanici.class);
        
        System.out.println("Kullanıcı İsmi: " + kullanici.isim);
    }
}

Bu kod bloğunda, readValue metodu JSON string verisini alır ve Kullanici sınıfının bir örneğini oluşturarak verileri bu örneğe atar.

Java Nesnesini JSON Formatına Çevirme

Uygulamanızda oluşturduğunuz verileri bir API'ye göndermek veya dosyaya kaydetmek istediğinizde, Java nesnesini JSON formatına çevirmeniz gerekir. Buna "serialization" denir. Yine ObjectMapper sınıfını kullanacağız.

Kullanici yeniKullanici = new Kullanici();
yeniKullanici.isim = "Ayşe";
yeniKullanici.yas = 25;
yeniKullanici.email = "ayse@example.com";

ObjectMapper mapper = new ObjectMapper();
String jsonCiktisi = mapper.writeValueAsString(yeniKullanici);

System.out.println(jsonCiktisi);

Bu işlem, Java nesnesinin alanlarını JSON anahtarlarıyla eşleştirerek bir metin dizisi oluşturur. Bu yöntem, veritabanından çektiğiniz verileri web arayüzüne JSON olarak aktarmak için kullanılır.

Karmaşık JSON Yapılarını Ayrıştırma

Gerçek dünya uygulamalarında JSON verileri genellikle iç içe geçmiş nesneler veya listeler içerir. Bu durumda, Java sınıflarınızı bu hiyerarşiye uygun şekilde modellemeniz gerekir. Örneğin, bir kullanıcının birden fazla adresi olduğunu varsayalım.

import java.util.List;

public class KullaniciDetay {
    public String isim;
    public List adresler;
}

Jackson kütüphanesi, List veya Map gibi koleksiyon tiplerini otomatik olarak tanır ve ayrıştırır. Karmaşık yapıları işlerken verinin doğruluğunu kontrol etmek için JsonNode yapısını da kullanabilirsiniz.

import com.fasterxml.jackson.databind.JsonNode;

String json = "{\"isim\":\"Mehmet\", \"adresler\":[\"İstanbul\", \"Ankara\"]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);

String isim = node.get("isim").asText();
System.out.println("İsim: " + isim);

JsonNode kullanımı, tüm sınıf yapısını oluşturmak istemediğiniz veya JSON yapısının dinamik olduğu durumlarda oldukça esneklik sağlar.

JSON İşleme Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
ObjectMapper (POJO) Tip güvenli, temiz kod Sınıf tanımlama gerektirir
JsonNode (Tree Model) Esnek, hızlı prototipleme Tip güvenliği düşük
Streaming API Çok büyük dosyalar için ideal Karmaşık kod yapısı

Güvenlik Uyarısı: Dışarıdan gelen JSON verilerini işlerken "Denial of Service" (DoS) saldırılarına karşı dikkatli olun. Aşırı büyük veya derin iç içe geçmiş JSON yapılarını sınırlamak için kütüphane ayarlarını (örneğin JsonFactory limitleri) yapılandırın. Ayrıca, veritabanı işlemlerinde JSON verilerini doğrudan sorgulara eklemekten kaçının; her zaman parametreli sorgular (PreparedStatement) kullanın.

Sıkça Sorulan Sorular

JSON ayrıştırma sırasında "UnrecognizedPropertyException" hatası alıyorum, neden?

Bu hata, JSON verisinde olup Java sınıfınızda karşılığı olmayan bir alan olduğunda oluşur. Çözüm olarak sınıfınıza @JsonIgnoreProperties(ignoreUnknown = true) notasyonunu ekleyerek bilinmeyen alanların yoksayılmasını sağlayabilirsiniz.

Java'da tarih formatlarını JSON'a nasıl çevirebilirim?

Tarih alanlarının üzerine @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") notasyonunu ekleyerek tarih formatını istediğiniz şekilde özelleştirebilirsiniz.

Büyük boyutlu JSON dosyalarını bellek sorunu yaşamadan nasıl okurum?

Bunun için Jackson'ın JsonParser (Streaming API) özelliğini kullanmalısınız. Tüm dosyayı belleğe yüklemek yerine, veriyi parça parça okuyarak işleyebilirsiniz.

JSON verisini güzelleştirmek (pretty print) mümkün mü?

Evet, mapper.writerWithDefaultPrettyPrinter().writeValueAsString(nesne) kullanarak JSON çıktısını okunabilir, girintili bir formatta alabilirsiniz.

Jackson yerine Gson kullanmalı mıyım?

Gson, Google tarafından geliştirilen basit ve etkili bir kütüphanedir. Eğer projeniz çok basitse ve minimal bağımlılık istiyorsanız Gson tercih edilebilir; ancak geniş kapsamlı ve performans odaklı projelerde Jackson endüstri standardıdır.

JSON İşleme Sürecinde Performans Optimizasyonu ve Bellek Yönetimi

Büyük ölçekli veri setleri ile çalışırken, JSON verilerini belleğe tamamen yüklemek (DOM tabanlı yaklaşım) ciddi performans darboğazlarına ve OutOfMemoryError hatalarına yol açabilir. Bu durumu aşmak için Jackson kütüphanesinin sunduğu Streaming API (JsonParser ve JsonGenerator) yapısını kullanmak en verimli yöntemdir.

Streaming API, veriyi bir akış gibi satır satır okur veya yazar; bu sayede tüm JSON ağacını bellekte tutmak yerine sadece o an işlenen düğüme odaklanır. Aşağıdaki örnekte, çok büyük bir JSON dosyasını bellek dostu bir şekilde nasıl okuyabileceğinizi görebilirsiniz:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public void streamLargeJson(File jsonFile) throws IOException {
    JsonFactory factory = new JsonFactory();
    try (JsonParser parser = factory.createParser(jsonFile)) {
        while (parser.nextToken() != JsonToken.END_OBJECT) {
            String fieldName = parser.getCurrentName();
            if ("kullaniciAdi".equals(fieldName)) {
                parser.nextToken();
                System.out.println("Kullanıcı: " + parser.getText());
            }
        }
    }
}

Bu yaklaşım, özellikle milyonlarca satırlık log dosyalarını veya geniş veri listelerini işlerken uygulamanızın kararlılığını korumasını sağlar. Bellek kullanımını minimize etmek için şu stratejileri uygulayabilirsiniz:

  • Data Binding Yerine Streaming: Küçük veriler için ObjectMapper uygun olsa da, büyük dosyalar için mutlaka JsonParser tercih edin.
  • Buffer Boyutlarını Ayarlayın: IO operasyonlarında kullanılan buffer boyutlarını sisteminize göre optimize edin.
  • Lazy Loading: Verileri ihtiyaç duyduğunuz anda ayrıştırın, tüm listeyi tek seferde bir Java List nesnesine doldurmaktan kaçının.

JSON Veri Entegrasyonunda Birim Testi ve Hata Ayıklama

JSON ayrıştırma mantığınızın doğruluğunu garanti altına almak için birim testleri (Unit Tests) yazmak kritik öneme sahiptir. Özellikle dış servislerden gelen JSON yapılarının değişme ihtimaline karşı, JUnit ve AssertJ kullanarak veri doğrulama testleri oluşturmalısınız.

Aşağıdaki test örneği, bir JSON string'inin beklenen Java nesnesine doğru şekilde dönüştürülüp dönüştürülmediğini kontrol eder:

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

public class JsonMappingTest {
    @Test
    public void testJsonToPojoMapping() throws Exception {
        String json = "{\"id\": 1, \"isim\": \"Ahmet\"}";
        ObjectMapper mapper = new ObjectMapper();
        
        Kullanici kullanici = mapper.readValue(json, Kullanici.class);
        
        assertThat(kullanici.getId()).isEqualTo(1);
        assertThat(kullanici.getIsim()).isEqualTo("Ahmet");
    }
}

Hata ayıklama (debugging) sürecinde ise, gelen ham JSON verisini doğrudan loglamak yerine, Jackson'ın hata mesajlarını detaylı inceleyin. Eğer JsonMappingException alıyorsanız, genellikle JSON'daki bir alanın Java nesnesindeki karşılığı ile uyuşmadığını (isim hatası veya tip uyumsuzluğu) anlarsınız. Bu gibi durumlarda @JsonIgnoreProperties(ignoreUnknown = true) anotasyonunu kullanarak, modelinizde tanımlanmamış ancak JSON'da gelen fazladan alanların süreci bozmasını engelleyebilirsiniz.

Profesyonel İpucu: Üretim ortamında JSON ayrıştırma hatalarını izlemek için merkezi bir loglama sistemi kullanın. Hatalı JSON verilerini "dead-letter queue" benzeri bir yapıda saklayarak, daha sonra manuel inceleme yapabilir ve veri yapısındaki beklenmedik değişiklikleri tespit edebilirsiniz.

Sonuç

Java ile JSON veri ayrıştırma ve işleme süreci, doğru kütüphaneler ve yaklaşımlarla oldukça verimli bir hale getirilebilir. Bu rehberde Jackson kütüphanesini kullanarak nesne eşleme, karmaşık yapıları okuma ve serialization işlemlerini temel seviyeden ileri seviyeye taşıdık. Bir sonraki adım olarak, REST API'ler ile entegrasyonu sağlamak için Spring Boot'un @RestController yapısını inceleyerek JSON verilerinin HTTP üzerinden nasıl otomatik işlendiğini keşfedebilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamındaki uygulamalarınızda, güvenlik açıklarını önlemek için girdi doğrulaması (input validation) yapmayı, kütüphanelerinizi güncel tutmayı ve hassas verileri şifreleyerek işlemeyi unutmayın. Yazılım güvenliği, sürekli güncellenen bir disiplindir.

Bu yazıya tepkinizi paylaşın:
Kerem Tekin

Teknoloji ve yazılım kullanımı üzerine pratik kılavuzlar hazırlıyorum. Karmaşık dijital araçları, herkesin hızlıca öğrenebileceği sade rehberler haline getirmekte uzmanım.

Yorumlar (17)

17
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Yılmaz
Caner Yılmaz 31 Temmuz 2026

Eline sağlık hocam, Jackson kütüphanesi gerçekten Java dünyasında standart oldu. Gson'dan Jackson'a geçiş yapacak arkadaşlar için güzel bir kaynak olmuş.

Kerem Tekin
Kerem Tekin 01 Ağustos 2026

Çok teşekkürler Caner, haklısın; performans ve esneklik açısından Jackson şu an bir adım önde.

Selin_Coder
Selin_Coder 01 Ağustos 2026

Ya bu ObjectMapper kullanırken tarih formatlarında hep hata alıyom, o konuya da ufak bi değinebilir miydin acaba? Yine de teşekkürler yazı için.

Kerem Tekin
Kerem Tekin 02 Ağustos 2026

Selin, tarih formatları için `@JsonFormat` anotasyonunu kullanmanı öneririm. Bir sonraki yazıda buna daha detaylı girerim.

Mertcan Öz
Mertcan Öz 02 Ağustos 2026

Güzel anlatım olmuş ama kod bloklarında biraz daha açıklama beklerdim, bazı kısımları anlamakta zorlandım açıkçası.

Zeynep Aras
Zeynep Aras 03 Ağustos 2026

Bence gayet anlaşılır Mertcan, belki Jackson dokümantasyonuna da bir göz atabilirsin.

Burak Şahin
Burak Şahin 03 Ağustos 2026

Harika özet. Projemde manuel parse yapıyodum, iş yükümü ciddi oranda azalttı bu yöntem. Sağolasın.

Deniz Yıldız
Deniz Yıldız 04 Ağustos 2026

Jackson'ın güvenlik açıklarıyla ilgili neler düşünüyosun? Büyük projelerde bi risk teşkil ediyo mu?

Kerem Tekin
Kerem Tekin 05 Ağustos 2026

Deniz, versiyonları güncel tuttuğun ve 'polymorphic deserialization' ayarlarını doğru yapılandırdığın sürece büyük bir sorun yaşamazsın.

Fatih Terzi
Fatih Terzi 04 Ağustos 2026

Java 17 ile birlikte record yapılarını kullanmak Jackson ile çok daha kolaylaştı, onu da ekleyebilirdin.

Ali Veli
Ali Veli 06 Ağustos 2026

Aynen, recordlar ile çok daha temiz kod yazılıyor, katılıyorum.

Ayşegül K.
Ayşegül K. 05 Ağustos 2026

Kodlardaki indentasyon bozuklukları biraz okumayı zorlaştırıyo ama içerik çok iyi, başarılar.

Kerem Tekin
Kerem Tekin 06 Ağustos 2026

Geri bildirim için teşekkürler Ayşegül, kod düzeni konusunda daha dikkatli olacağım.

Emre Gök
Emre Gök 05 Ağustos 2026

Çok açıklayıcı olmuş, proje ödevimde tamda bunu arıyordum. Emeklerine sağlık.

Hakan Demir
Hakan Demir 06 Ağustos 2026

Spring Boot kullanırken objectMapper'ı bean olarak tanımlamak daha mantıklı değil mi? Niye her seferinde yeni nesne oluşturduk?

Kerem Tekin
Kerem Tekin 07 Ağustos 2026

Hakan, haklısın. Spring Boot projelerinde `ObjectMapper` zaten bean olarak mevcut, ben saf Java örneği üzerinden anlatmak istediğim için böyle yaptım.

Gizemli Kodcu
Gizemli Kodcu 06 Ağustos 2026

Gayet başarılı bi yazı olmuş, devamını bekliyoruz.

Yorum Yaz