Java İle Jackson Nasıl Yapılır?

Java İle Jackson Nasıl Yapılır?
Java İle Jackson Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Jackson kütüphanesini Java projenizde kullanabilmek için öncelikle gerekli bağımlılıkları (dependencies) projenize eklemeniz gerekir. Günümüz modern Java projelerinde genellikle Maven veya Gradle yapılandırma araçları kullanılmaktadır. Jackson, modüler bir yapıya sahiptir; en temel işlemleri gerçekleştirmek için jackson-databind modülünü eklemek yeterlidir. Bu modül, kendi içerisinde jackson-core ve jackson-annotations modüllerini de otomatik olarak getirir.

Aşağıdaki XML kod bloğunda, bir Maven projesi için pom.xml dosyasına eklenmesi gereken güncel Jackson bağımlılıkları yer almaktadır. Modern Java projelerinde tarih ve saat işlemlerini (Java 8 Date/Time API) doğru yönetebilmek için jackson-datatype-jsr310 modülünü de eklemek en iyi pratiklerden biridir.


    
    
        com.fasterxml.jackson.core
        jackson-databind
        2.18.2
    
    
    
    
        com.fasterxml.jackson.datatype
        jackson-datatype-jsr310
        2.18.2
    

Eğer projenizde Gradle kullanıyorsanız, build.gradle dosyanızın dependencies bölümüne aşağıdaki satırları ekleyerek aynı bağımlılıkları tanımlayabilirsiniz:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.2'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.2'

Gereksinimleri tamamladıktan sonra, Jackson'ın en temel sınıfı olan ObjectMapper ile nesnelerimizi JSON formatına dönüştürme işlemine geçebiliriz.

1. Jackson ObjectMapper ile Temel Serileştirme Nasıl Yapılır?

Serileştirme (Serialization), Java dilinde oluşturulmuş bir nesnenin (Object) durumunu, ağ üzerinden iletilebilecek veya bir dosyaya kaydedilebilecek bir veri formatına (bu senaryoda JSON) dönüştürme işlemidir. Jackson kütüphanesinde bu işlemi üstlenen ana sınıf com.fasterxml.jackson.databind.ObjectMapper sınıfıdır.

İlk örneğimizde, basit bir kullanıcı (User) sınıfı tanımlayacağız ve bu sınıftan ürettiğimiz bir nesneyi Jackson kullanarak JSON string ifadesine dönüştüreceğiz. Bu işlem adım adım nasıl gerçekleştirilir, aşağıdaki örnek kod üzerinde inceleyelim.

package com.ornek.jackson;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.Serializable;

public class TemelSerilestirme {

    // Serileştirilecek basit bir Java POJO (Plain Old Java Object) sınıfı
    public static class Kullanici implements Serializable {
        private Long id;
        private String ad;
        private String eposta;

        // Jackson'ın nesneyi oluşturabilmesi için varsayılan kurucu metot (Constructor) gereklidir
        public Kullanici() {}

        public Kullanici(Long id, String ad, String eposta) {
            this.id = id;
            this.ad = ad;
            this.eposta = eposta;
        }

        // Getter ve Setter metotları Jackson tarafından alanlara erişmek için kullanılır
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }

        public String getAd() { return ad; }
        public void setAd(String ad) { this.ad = ad; }

        public String getEposta() { return eposta; }
        public void setEposta(String eposta) { this.eposta = eposta; }
    }

    public static void main(String[] args) {
        try {
            // 1. ObjectMapper örneği oluşturulur
            ObjectMapper mapper = new ObjectMapper();

            // 2. Serileştirilecek nesne hazırlanır
            Kullanici kullanici = new Kullanici(1L, "Ahmet Yılmaz", "ahmet@yazilim.com");

            // 3. Nesne JSON String formatına dönüştürülür
            String jsonSonucu = mapper.writeValueAsString(kullanici);

            // Sonucu konsola yazdıralım
            System.out.println("Oluşturulan JSON Çıktısı:");
            System.out.println(jsonSonucu);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Yukarıdaki kod çalıştırıldığında, mapper.writeValueAsString() metodu Java nesnesini analiz eder ve standart bir JSON çıktısı üretir. Çıktı şu şekilde olacaktır: {"id":1,"ad":"Ahmet Yılmaz","eposta":"ahmet@yazilim.com"}. Jackson, bu dönüşümü gerçekleştirmek için Java Yansıma (Reflection) mekanizmasını kullanarak sınıftaki "getter" metotlarını analiz eder.

2. Jackson ile JSON Verisini Java Nesnesine Dönüştürme Adım Adım

Ters Serileştirme (Deserialization), JSON formatındaki bir metinsel veriyi alıp, bu veriyi anlamlı bir Java nesnesine dönüştürme sürecidir. Örneğin, bir REST API'den gelen JSON yanıtını uygulamanız içinde işlemek için bu yöntemi kullanırsınız.

Bu adımda, elimizdeki bir JSON string değerini nasıl tekrar Java nesnesine dönüştüreceğimizi göreceğiz. İşlemin hatasız gerçekleşmesi için hedef Java sınıfında parametresiz bir varsayılan kurucu metodun (default constructor) bulunması kritik önem taşır.

package com.ornek.jackson;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.ornek.jackson.TemelSerilestirme.Kullanici;

public class TemelTersSerilestirme {

    public static void main(String[] args) {
        // Test için kullanılacak JSON verisi
        String jsonGirdisi = "{\"id\":2,\"ad\":\"Mehmet Demir\",\"eposta\":\"mehmet@yazilim.com\"}";

        try {
            // ObjectMapper nesnesi oluşturulur
            ObjectMapper mapper = new ObjectMapper();

            // readValue metodu ile JSON string, belirtilen sınıfa dönüştürülür
            Kullanici kullanici = mapper.readValue(jsonGirdisi, Kullanici.class);

            // Dönüşümün doğruluğunu test edelim
            System.out.println("Java Nesnesine Dönüştürüldü:");
            System.out.println("ID: " + kullanici.getId());
            System.out.println("Ad: " + kullanici.getAd());
            System.out.println("E-posta: " + kullanici.getEposta());

        } catch (Exception e) {
            System.err.println("Dönüştürme sırasında hata oluştu: " + e.getMessage());
        }
    }
}

Bu örnekte mapper.readValue() metodu kullanılmıştır. Bu metot, ilk parametre olarak JSON kaynağını (String, File, URL veya InputStream olabilir), ikinci parametre olarak ise hedef sınıf tipini alır. Jackson, JSON anahtarlarını (key) Java sınıfındaki değişken isimleri veya setter metotları ile eşleştirerek nesneyi başarıyla doldurur.

3. Jackson Annotations (Anotasyonlar) Kullanımı ve Örnek Kod

Gerçek dünya projelerinde, Java sınıflarımızdaki değişken isimleri ile dış dünyadan gelen JSON anahtarları her zaman birebir eşleşmeyebilir. Örneğin, Java standartlarında değişkenler camelCase (deveÖrneği) yazılırken, JSON API'lerinde snake_case (yılan_örneği) tercih edilebilir. Bu tür durumlarda Jackson anotasyonları devreye girer.

Aşağıdaki örnekte, en sık kullanılan Jackson anotasyonlarını (@JsonProperty, @JsonIgnore, @JsonInclude ve @JsonFormat) bir arada kullanarak veri modelimizi nasıl özelleştirebileceğimizi göreceğiz.

package com.ornek.jackson;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.time.LocalDateTime;

public class AnotasyonKullanimi {

    // Sadece null olmayan alanları JSON'a dahil et
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class Urun {
        
        // JSON'daki "product_id" alanını bu değişkene eşle
        @JsonProperty("product_id")
        private Long id;

        @JsonProperty("product_name")
        private String urunAdi;

        // Güvenlik veya gizlilik nedeniyle bu alanın JSON'a yazılmasını engelle
        @JsonIgnore
        private double maliyetFiyati;

        private double satisFiyati;

        // Tarih formatını özel olarak belirle
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime eklenmeTarihi;

        public Urun() {}

        public Urun(Long id, String urunAdi, double maliyetFiyati, double satisFiyati, LocalDateTime eklenmeTarihi) {
            this.id = id;
            this.urunAdi = urunAdi;
            this.maliyetFiyet = maliyetFiyati; // Not: Değişken ataması
            this.maliyetFiyati = maliyetFiyati;
            this.satisFiyati = satisFiyati;
            this.eklenmeTarihi = eklenmeTarihi;
        }

        // Getter ve Setter metotları
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }

        public String getUrunAdi() { return urunAdi; }
        public void setUrunAdi(String urunAdi) { this.urunAdi = urunAdi; }

        public double getMaliyetFiyati() { return maliyetFiyati; }
        public void setMaliyetFiyati(double maliyetFiyati) { this.maliyetFiyati = maliyetFiyati; }

        public double getSatisFiyati() { return satisFiyati; }
        public void setSatisFiyati(double satisFiyati) { this.satisFiyati = satisFiyati; }

        public LocalDateTime getEklenmeTarihi() { return eklenmeTarihi; }
        public void setEklenmeTarihi(LocalDateTime eklenmeTarihi) { this.eklenmeTarihi = eklenmeTarihi; }
    }

    public static void main(String[] args) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            // Modern Java tarih modülünü ObjectMapper'a kaydediyoruz
            mapper.registerModule(new JavaTimeModule());

            Urun urun = new Urun(101L, "Akıllı Telefon", 4500.0, 7500.0, LocalDateTime.now());

            String jsonCikti = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(urun);
            System.out.println("Anotasyonlu Ürün JSON Çıktısı:");
            System.out.println(jsonCikti);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Yukarıdaki kod çalıştırıldığında, çıktı incelendiğinde maliyetFiyati alanının JSON'da yer almadığı (@JsonIgnore sayesinde), tarih alanının ise belirttiğimiz şablona uygun olarak biçimlendirildiği görülür. Ayrıca değişken isimleri Java tarafında farklı olsa da JSON çıktısında product_id ve product_name olarak yer alır.

4. Jackson JsonNode ile Dinamik JSON Yönetimi Nasıl Yapılır?

Her senaryoda JSON verilerini karşılayacak hazır bir Java sınıfımız (POJO) olmayabilir. Özellikle dinamik veya çok karmaşık, şeması sürekli değişen JSON verileriyle çalışırken Jackson'ın Ağ Modeli (Tree Model) yapısını kullanmak çok daha pratiktir. Bu modelde veriler, hiyerarşik bir ağaç yapısı sunan JsonNode sınıfı ile temsil edilir.

Aşağıdaki örnek kodda, karmaşık bir JSON yapısını herhangi bir Java sınıfına eşlemeden, doğrudan JsonNode kullanarak nasıl okuyacağımızı ve içindeki verilere nasıl erişeceğimizi göreceğiz.

package com.ornek.jackson;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DinamikJsonYonetimi {

    public static void main(String[] args) {
        String karmasikJson = "{\n" +
                "  \"sirket\": \"Kod Akademisi\",\n" +
                "  \"aktif\": true,\n" +
                "  \"adres\": {\                
Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve ev düzeni konularında yıllardır içerik üretiyorum. Okuyuculara zaman kazandıran, uygulanabilir ve sürdürülebilir yaşam tarzı önerileri sunuyorum.

Yorumlar (0)

Yorum Yaz