Java JSON İşleme Rehberi: Okuma, Yazma ve Ayrıştırma 💻
🧠 Bu Rehberde Ne Öğreneceksiniz?
Bu rehber, Java'da JSON (JavaScript Object Notation) verilerini işlemek için kullanılan JSR 353 (Java JSON Processing API) standardını adım adım anlatır.
JSON verilerini Java nesnesine okuma (JsonReader), Java nesnesinden JSON oluşturma (JsonWriter) ve akış tabanlı ayrıştırma (JsonParser) yöntemlerini öğreneceksiniz.
Ayrıca, JSON verilerini hafızada tutmadan işleme (Streaming API) ve küçük nesneleri kolayca oluşturma (Object Model API) tekniklerini de göreceksiniz.
⚙️ Java ve JSON İşleme (JSR 353)
JSON, anahtar-değer çiftlerinden oluşan, insan tarafından kolay okunabilir hafif bir veri biçimidir.
Web servislerinde ve API yanıtlarında XML’e göre daha kompakt olduğu için tercih edilir.
JSR 353 standardı ile Java, JSON verilerini işlemek için iki model sunar:
| API Türü | Açıklama |
|---|---|
| Object Model API | Küçük JSON verileri için uygundur. Tüm JSON’u belleğe yükler, DOM benzeri yapı sunar. (JsonReader, JsonObject) |
| Streaming API | Büyük JSON verileri için idealdir. Olay tabanlı (event-driven) çalışır, belleği verimli kullanır. (JsonParser, JsonGenerator) |
🧩 Maven Bağımlılığı
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.2</version>
</dependency>
💬 Not: GlassFish 4.0 ve üzeri sürümlerde bu kütüphane zaten dahildir.
📥 Adım 1: JSON Verisini Java Nesnesine Okuma (JsonReader)
Bu örnekte calisan.json adlı dosyadaki verileri okuyup bir Employee (Çalışan) nesnesine dönüştüreceğiz.
Örnek JSON Verisi (calisan.json)
{
"id": 404,
"adSoyad": "Rabisu Yılmaz",
"calismaDurumu": true,
"adres": {
"sokak": "Teknoloji Caddesi",
"sehir": "Ankara",
"postaKodu": 6000
},
"telefonlar": [5321112233, 5459998877],
"gorev": "Teknik Yazar"
}
Okuma Kodu
import java.io.FileInputStream;
import java.io.InputStream;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
public class CalisanJSONOkuyucu {
public static final String JSON_FILE = "calisan.json";
public static void main(String[] args) throws Exception {
InputStream girisAkimi = new FileInputStream(JSON_FILE);
JsonReader jsonOkuyucu = Json.createReader(girisAkimi);
JsonObject jsonNesne = jsonOkuyucu.readObject();
jsonOkuyucu.close();
girisAkimi.close();
Employee calisan = new Employee();
calisan.setId(jsonNesne.getInt("id"));
calisan.setName(jsonNesne.getString("adSoyad"));
calisan.setRole(jsonNesne.getString("gorev"));
System.out.println(calisan);
}
}
💬 Açıklama: JsonReader, tüm JSON verisini belleğe yükleyip JsonObject olarak erişim sağlar. Bu yöntem küçük dosyalar için uygundur.
📤 Adım 2: Java Nesnesini JSON Formatında Yazma (JsonWriter)
Şimdi bir Employee nesnesi oluşturup, JSON formatına dönüştürüp dosyaya yazacağız.
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonWriter;
public class CalisanJSONYazici {
public static void main(String[] args) throws Exception {
JsonObject adres = Json.createObjectBuilder()
.add("sokak", "Bulut Sk.")
.add("sehir", "İstanbul")
.add("postaKodu", 34000)
.build();
JsonObject calisan = Json.createObjectBuilder()
.add("id", 100)
.add("adSoyad", "Deniz")
.add("calismaDurumu", false)
.add("gorev", "Müdür")
.add("telefonlar", Json.createArrayBuilder().add(123456).add(987654))
.add("adres", adres)
.build();
OutputStream cikis = new FileOutputStream("yeni_calisan.json");
JsonWriter yazici = Json.createWriter(cikis);
yazici.writeObject(calisan);
yazici.close();
System.out.println("JSON dosyası başarıyla oluşturuldu!");
}
}
💬 Açıklama: JsonObjectBuilder ve JsonArrayBuilder sınıfları, Builder Pattern ile iç içe JSON yapısı oluşturmayı kolaylaştırır.
🔍 Adım 3: Akış Modeliyle JSON Ayrıştırma (JsonParser)
Büyük JSON dosyalarında, tüm veriyi belleğe yüklemek yerine olay tabanlı ayrıştırma (event-driven parsing) tercih edilir.
import java.io.FileInputStream;
import java.io.InputStream;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;
public class CalisanJSONAyristirici {
public static void main(String[] args) throws Exception {
InputStream giris = new FileInputStream("calisan.json");
JsonParser parser = Json.createParser(giris);
String anahtar = null;
while (parser.hasNext()) {
Event olay = parser.next();
switch (olay) {
case KEY_NAME:
anahtar = parser.getString();
break;
case VALUE_STRING:
System.out.println(anahtar + ": " + parser.getString());
break;
case VALUE_NUMBER:
System.out.println(anahtar + ": " + parser.getLong());
break;
default:
// diğer event tipleri
}
}
parser.close();
giris.close();
}
}
💬 Açıklama: JsonParser, olay tabanlı çalışır. Her bir KEY_NAME – VALUE_* çifti işlenir ve hafızada büyük nesneler tutulmaz.
📚 JSON API Sınıfları Özeti
| Sınıf | Açıklama |
|---|---|
| JsonReader | JSON verisini nesne olarak okumak için kullanılır. |
| JsonWriter | Java nesnesini JSON dosyasına yazmak için kullanılır. |
| JsonParser | Büyük dosyalarda akış tabanlı ayrıştırma sağlar. |
| JsonGenerator | JSON çıktısını adım adım oluşturur. |
| JsonObject | JSON nesnesini temsil eder. |
| JsonArray | JSON dizilerini temsil eder. |
❓ Sıkça Sorulan Sorular (SSS)
- JSON-P ve JSON-B farkı nedir?
JSON-P (Processing), düşük seviyeli bir API’dir; JSON-B (Binding), Java nesnelerini otomatik olarak JSON’a dönüştürür.
- Neden JsonReader yerine JsonParser kullanmalıyım?
Büyük dosyalarda belleği optimize etmek için JsonParser tercih edilir.
- Java’da JSON işleme için başka kütüphaneler var mı?
Evet: Jackson ve Gson, JSON-B benzeri şekilde çalışır ve otomatik dönüşüm sağlar.
- JsonObject HashMap gibi mi çalışır?
Evet ama JsonObject değişmez (immutable) bir yapıdır, HashMap ise değiştirilebilir (mutable) yapıdadır.
- JSON verisini nasıl doğrularım?
JSONLint gibi araçlarla doğrulama yapabilir veya javax.json hata yakalama mekanizmalarını kullanabilirsin.
🧩 Sonuç
Bu rehberde, Java JSON Processing API’nin (JSR 353) temel yapı taşlarını öğrendiniz. Artık JSON verilerini okuyabilir, oluşturabilir ve akış tabanlı olarak ayrıştırabilirsiniz.
🚀 JSON işleme becerilerinizi Rabisu Bulut platformunda deneyin, yüksek performanslı Java altyapısını test edin!