- Konu sahibi
- #1
JSON verisini Java’da okumanın en pratik yollarından biri, JSON işleme kütüphanelerinden Jackson kullanmaktır. Önce
Maven kullanıyorsanız
Gradle kullanıyorsanız aynı bağımlılığı
Sürüm yerine doğrudan örnek bir sayı yazmak yerine, projenizin bağımlılık yönetiminde kullandığı güncel ve birbiriyle uyumlu Jackson sürümünü kullanın.
JSON yapısını önceden biliyorsanız, veriyi karşılayan bir Java sınıfı tanımlayıp
Bu örnekte
Bu çıktı, JSON metninin başarıyla çözümlendiğini ve değerlerin Java türlerine aktarıldığını gösterir. Ancak yalnızca JSON’ın sözdizimi doğru olduğu anlamına gelir; örneğin
JSON yapısı her zaman sabit değilse veya yalnızca birkaç alanı okumak istiyorsanız
JSON veri metni bir dosyadaysa, dosya yolunu
Buradaki yol, uygulamanın çalışma dizinine göre değerlendirilir. Dosya bulunamazsa dosya yolunu, çalışma dizinini ve dosyanın gerçekten paketlenmiş ya da çalışma ortamına kopyalanmış olup olmadığını kontrol edin. Dosyadan gelen JSON güvenilmeyen bir kaynaktan alınmışsa içeriği doğrudan çalıştırmayın; JSON yalnızca veri olarak işlenmelidir.
JSON okunurken hata oluşması genellikle üç durumdan birine işaret eder:
JSON başarıyla okunmuş olsa bile alan doğrulaması yapın. Örneğin zorunlu bir alanın boş olup olmadığını, sayısal değerin beklenen aralıkta bulunup bulunmadığını ve tarih bilgisinin kabul edilen biçimde gelip gelmediğini ayrıca kontrol edin. JSON ayrıştırma işlemi yalnızca metni Java değerlerine dönüştürür; kimlik doğrulama, yetkilendirme ve iş kuralı denetimi yapmaz.
JSON şeması sabitse ve veriyi uygulama içinde tekrar tekrar kullanacaksanız Java sınıfına dönüştürmek daha düzenlidir. Alanların değişebildiği, yalnızca birkaç değerin gerektiği veya JSON yapısının önceden bilinmediği durumlarda
jackson-databind bağımlılığını projeye ekleyin, ardından JSON metnini ObjectMapper ile Java sınıfına veya JsonNode ağacına dönüştürün. Böylece alan değerlerini okuyabilir, eksik veya hatalı veriyi ayırt edebilir ve sonucu uygulamanızdaki iş akışına aktarabilirsiniz.Projeye Jackson ekleme
Maven kullanıyorsanız
pom.xml içindeki bağımlılıklara Jackson Databind paketini ekleyin. Sürüm numarasını projenizin kullandığı Jackson sürümleriyle uyumlu olacak şekilde belirleyin; tüm Jackson paketlerinde aynı sürüm ailesini kullanmanız uyumluluk sorunlarını azaltır.
XML:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>PROJENİZİN_JACKSON_SÜRÜMÜ</version>
</dependency>
Gradle kullanıyorsanız aynı bağımlılığı
dependencies bölgesine ekleyebilirsiniz:
Kod:
implementation 'com.fasterxml.jackson.core:jackson-databind:PROJENİZİN_JACKSON_SÜRÜMÜ'
Sürüm yerine doğrudan örnek bir sayı yazmak yerine, projenizin bağımlılık yönetiminde kullandığı güncel ve birbiriyle uyumlu Jackson sürümünü kullanın.
JSON alanlarını doğrudan okumak
JSON yapısını önceden biliyorsanız, veriyi karşılayan bir Java sınıfı tanımlayıp
readValue yöntemiyle nesneye dönüştürebilirsiniz. Aşağıdaki örnek varsayımsal bir kullanıcı JSON’ını okur:
Java:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonOkumaOrnegi {
public static void main(String[] args) throws Exception {
String json = "{\"id\":42,\"ad\":\"Ayşe\",\"aktif\":true}";
ObjectMapper mapper = new ObjectMapper();
Kullanici kullanici = mapper.readValue(json, Kullanici.class);
System.out.println("Kimlik: " + kullanici.id());
System.out.println("Ad: " + kullanici.ad());
System.out.println("Aktif: " + kullanici.aktif());
}
public record Kullanici(int id, String ad, boolean aktif) {
}
}
Bu örnekte
json değişkeni giriş verisidir. Jackson, JSON alanlarını record içindeki aynı adlı bileşenlerle eşleştirir. Programın çıktısı yaklaşık olarak şöyle olur:
Kod:
Kimlik: 42
Ad: Ayşe
Aktif: true
Bu çıktı, JSON metninin başarıyla çözümlendiğini ve değerlerin Java türlerine aktarıldığını gösterir. Ancak yalnızca JSON’ın sözdizimi doğru olduğu anlamına gelir; örneğin
id değerinin uygulamanız için geçerli bir kullanıcıya ait olduğunu veya ad alanının iş kurallarını karşıladığını kanıtlamaz. Bu tür kontrolleri ayrıca uygulamanız gerekir.record kullanmak için projenizin Java sürümünün record özelliğini desteklemesi gerekir. Daha eski bir Java sürümünde aynı alanları içeren normal bir sınıf, uygun kurucu ve erişim yöntemleri kullanabilirsiniz.Alanları esnek biçimde okumak
JSON yapısı her zaman sabit değilse veya yalnızca birkaç alanı okumak istiyorsanız
JsonNode kullanabilirsiniz. Bu yaklaşımda JSON, ağaç yapısına dönüştürülür:
Java:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonNodeOrnegi {
public static void main(String[] args) throws Exception {
String json = "{\"urun\":{\"ad\":\"Klavye\",\"fiyat\":799.90},\"stokta\":true}";
ObjectMapper mapper = new ObjectMapper();
JsonNode kok = mapper.readTree(json);
String urunAdi = kok.path("urun").path("ad").asText();
double fiyat = kok.path("urun").path("fiyat").asDouble();
boolean stokta = kok.path("stokta").asBoolean();
System.out.println(urunAdi);
System.out.println(fiyat);
System.out.println(stokta);
}
}
path yöntemi, aranan alan bulunmadığında doğrudan null yerine eksik düğümü temsil eden bir değer döndürür. Bu nedenle örnek, eksik alanlarda beklenmedik NullPointerException riskini azaltır. Fakat asText(), asInt() veya asBoolean() gibi yöntemler eksik ya da uyumsuz veriler için varsayılan değerler üretebilir. Alanın gerçekten gelip gelmediğini kesin olarak denetlemeniz gerekiyorsa önce has veya isMissingNode ile kontrol edin.JSON dosyasını okumak
JSON veri metni bir dosyadaysa, dosya yolunu
Path ile açıp readTree veya readValue yöntemine aktarabilirsiniz:
Java:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.file.Path;
public class DosyadanJsonOkuma {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Path dosya = Path.of("veriler", "kullanici.json");
JsonNode kok = mapper.readTree(dosya.toFile());
String ad = kok.path("ad").asText();
System.out.println("Okunan ad: " + ad);
}
}
Buradaki yol, uygulamanın çalışma dizinine göre değerlendirilir. Dosya bulunamazsa dosya yolunu, çalışma dizinini ve dosyanın gerçekten paketlenmiş ya da çalışma ortamına kopyalanmış olup olmadığını kontrol edin. Dosyadan gelen JSON güvenilmeyen bir kaynaktan alınmışsa içeriği doğrudan çalıştırmayın; JSON yalnızca veri olarak işlenmelidir.
Hatalı JSON sonucunu yorumlama
JSON okunurken hata oluşması genellikle üç durumdan birine işaret eder:
- JSON sözdizimi bozuktur. Eksik tırnak, virgül, köşeli parantez veya süslü parantez olup olmadığını kontrol edin.
- JSON yapısı Java sınıfıyla eşleşmiyordur. Alan adlarını, veri türlerini ve iç içe nesneleri karşılaştırın.
- Dosya yolu veya karakter kodlaması yanlıştır. Dosyanın gerçekten okunduğunu ve beklenen metnin uygulamaya ulaştığını doğrulayın.
readValue sırasında JsonProcessingException veya bunun alt türlerinden biri oluşursa hata mesajı çoğunlukla hatanın bulunduğu satır ve sütunu belirtir. Bu konum, özellikle eksik virgül veya kapanmayan tırnak gibi sözdizimi sorunlarını bulmak için kullanılır. Hata mesajını kullanıcıya ham hâliyle göstermek yerine, üretim ortamında hassas dosya yollarını veya veri içeriğini açığa çıkarmadan kaydedin.JSON başarıyla okunmuş olsa bile alan doğrulaması yapın. Örneğin zorunlu bir alanın boş olup olmadığını, sayısal değerin beklenen aralıkta bulunup bulunmadığını ve tarih bilgisinin kabul edilen biçimde gelip gelmediğini ayrıca kontrol edin. JSON ayrıştırma işlemi yalnızca metni Java değerlerine dönüştürür; kimlik doğrulama, yetkilendirme ve iş kuralı denetimi yapmaz.
Hangi yaklaşımı seçmelisiniz?
JSON şeması sabitse ve veriyi uygulama içinde tekrar tekrar kullanacaksanız Java sınıfına dönüştürmek daha düzenlidir. Alanların değişebildiği, yalnızca birkaç değerin gerektiği veya JSON yapısının önceden bilinmediği durumlarda
JsonNode daha esnektir. Her iki yöntemde de beklenmeyen alanları, eksik zorunlu değerleri ve veri türü uyuşmazlıklarını uygulamanızın ihtiyacına göre ayrıca doğrulamalısınız.