Java JSON

Paylaş

Java ile JSON işlemlerinde kullanılan JSON-P ve JSON-B kütüphanelerinin kurulumu, parser, writer, reader örnekleri ve kullanımı yer alıyor.

JSON Nedir?

JSON hakkında detaylı bilgi almak için JSON Nedir? yazıma bakmalısın.

Java JSON

Java ile JSON işlemleri için GSON, Jackson, Yasson gibi çeşitli kütüphaneler mevcuttur.

Standart olmayan kütüphanelerin kullanımı kütüphane desteğinin kaldırılması veya köklü değişiklik sonrası beklenmedik durumlar ortaya çıkartabilir.

Standart olmayan kütüphaneler yerine aşağıda yer alan JSR şartnameleri kullanılabilir.

  • JSR 353 – JavaTM API for JSON Processing (JSON-P)
  • JSR 374 – JavaTM API for JSON Processing 1.1 (JSON-P)
  • JSR 367 – JavaTM API for JSON Binding (JSON-B)

Kurulum

JSR şartnamesi için referans implementation olan Eclipse Yasson kurulumu için bağımlılığın pom.xml dosyasına eklenmesi yeterlidir.

<!-- https://mvnrepository.com/artifact/org.eclipse/yasson -->
<dependency>
    <groupId>org.eclipse</groupId>
    <artifactId>yasson</artifactId>
    <version>3.0.3</version>
</dependency>

NOT: Eclipse Yasson 2 ile birlikte javax.json paketi jakarta.json olmuştur.

Java JSON işlemlerini Java XML işlemlerindeki gibi işleme (JSON-P – JAXP) ve bağlama (JSON-B – JAXB) ile yapmayı sağlar.

JSON-P

JSON-P veya JSON Processing ayrıştırma (parse), oluşturma (generate), dönüştürme (transform) ve sorgulama (query) işlemlerinde kullanılır.

JSON-P işlemleri Object Model API ve Streaming Model API olmak üzere iki farklı yöntem ile yapılır.

Object Model API için JsonObjectBuilder, JsonArrayBuilder, JsonReader, JsonWriter kullanılırken Streaming Model API için JsonParser ve JsonGenerator kullanılır.

Her iki yönteme ait nesnelere ulaşmak için javax.json.Json sınıfı metotları kullanılabilir.

Object Model API yöntemini kullanarak JSON Nedir? yazımda yer alan JSON çıktısını oluşturalım.

public class App {

    public static void main(String[] args) {

        JsonObject jsonObject = Json.createObjectBuilder()
                .add("kisiler", Json.createArrayBuilder()
                        .add(Json.createObjectBuilder()
                                .add("sira", 1)
                                .add("adi", "Yusuf")
                                .add("soyadi", "Sezer"))
                        .add(Json.createObjectBuilder()
                                .add("sira", 2)
                                .add("adi", "Ramazan")
                                .add("soyadi", "Sezer"))
                        .add(Json.createObjectBuilder()
                                .add("sira", 3)
                                .add("adi", "Sinan")
                                .add("soyadi", "Sezer"))
                        .add(Json.createObjectBuilder()
                                .add("sira", 4)
                                .add("adi", "Mehmet")
                                .add("soyadi", "Sezer"))).build();
        Json.createWriter(System.out).write(jsonObject);

    }
}

Yukarıdaki örnekte Json sınıfı yardımıyla JsonObjectBuilder, JsonArrayBuilder elde edilerek add metodu ile alanlar, build metodu ile JSON oluşturulmuştur.

Oluşturulan JSON dosyasını yazdırmak için JsonWriter kullanılarak ekran çıktısı olarak yazılması sağlanmıştır.

Dosya veya farklı kaynağa yazmak için Writer-FileWriter veya OutputStream-FileOutputStream kullanılabilir.

Çıktıyı formatlı olarak yazdırmak için JsonWriterFactory aşağıdaki gibi kullanılabilir.

// önceki kodlar
var config = Map.ofEntries(
        Map.entry(JsonGenerator.PRETTY_PRINTING, "true")
);
JsonWriter writer = Json.createWriterFactory(config).createWriter(new FileWriter("kisiler.json"));
writer.writeObject(jsonObject);
writer.close();

Object Model API ile JSON okuma işlemi için JsonReader arayüzü kullanılır.

Okuma işleminde tüm veriler belleğe yüklenir.

public class App {

    public static void main(String[] args) throws IOException {

        String json = """
                    {"kisiler": [
                        { "sira": "1", "adi": "Yusuf", "soyadi": "Sezer" },
                        { "sira": "2", "adi": "Ramazan", "soyadi": "Sezer" },
                        { "sira": "3", "adi": "Sinan", "soyadi": "Sezer" },
                        { "sira": "4", "adi": "Mehmet", "soyadi": "Sezer" }
                    ]}
                    """;
        JsonReader reader = Json.createReader(new StringReader(json));
        System.out.println(reader.read());
        reader.close();

    }
}

Arayüzde yer alan read, readArray, readObject, readValue metotlar kullanılarak JsonStructure, JsonArray, JsonObject ve JsonValue nesneleri elde edilir.

Nesnelerde yer alan metotlar kullanılarak JSON içerisinde istenilen alana ulaşılır.

public class App {

    public static void main(String[] args) throws IOException {

        String json = """
                    {"kisiler": [
                        { "sira": 1, "adi": "Yusuf", "soyadi": "Sezer" },
                        { "sira": 2, "adi": "Ramazan", "soyadi": "Sezer" },
                        { "sira": 3, "adi": "Sinan", "soyadi": "Sezer" },
                        { "sira": 4, "adi": "Mehmet", "soyadi": "Sezer" }
                    ]}
                    """;
        JsonReader reader = Json.createReader(new StringReader(json));
        JsonObject yusuf = reader
                .readObject()
                .get("kisiler")
                .asJsonArray()
                .get(0)
                .asJsonObject();
        System.out.println(yusuf);
        System.out.println(yusuf.getInt("sira", 0));
        System.out.println(yusuf.getString("adi"));
        System.out.println(yusuf.getString("soyadi"));
        reader.close();

    }
}

JsonArray arayüzü List arayüzünün kalıtım ile genişletiği için JsonArray ile List arayüzüne ait metotlar kullanılabilir.

reader
        .readObject()
        .get("kisiler")
        .asJsonArray()
        //.size();
        //.stream();
        .forEach(System.out::println);

JsonObject arayüzü Map arayüzünün kalıtım ile genişletiği için JsonObject ile Map arayüzüne ait metotlar kullanılabilir.

reader
        .readObject()
        .get("kisiler")
        .asJsonArray()
        .get(0)
        .asJsonObject()
        .entrySet()
        .forEach(System.out::println);

Tek yönlü olarak sadece işlem yapılan yer belleğe yüklenir.

Streaming Model API yöntemini kullanarak JSON Nedir? yazımda yer alan JSON çıktısını oluşturalım.

public class App {

    public static void main(String[] args) {

        Json.createGenerator(System.out)
                .writeStartObject()
                    .writeStartArray("kisiler")
                        .writeStartObject()
                        .write("sira", "1")
                        .write("adi", "Yusuf")
                        .write("soyadi", "Sezer")
                        .writeEnd()
                        .writeStartObject()
                        .write("sira", "2")
                        .write("adi", "Ramazan")
                        .write("soyadi", "Sezer")
                        .writeEnd()
                        .writeStartObject()
                        .write("sira", "3")
                        .write("adi", "Sinan")
                        .write("soyadi", "Sezer")
                        .writeEnd()
                        .writeStartObject()
                        .write("sira", "4")
                        .write("adi", "Mehmet")
                        .write("soyadi", "Sezer")
                        .writeEnd()
                    .writeEnd()
                .writeEnd()
                .close();

    }
}

Örnekte Json sınıfı yardımıyla JsonGenerator elde edilerek arayüz içerisinde yer alan writeStartObject, writeStartArray, write, writeEnd metotları ile JSON oluşturulmuştur.

Dosya veya farklı kaynağa yazmak için Writer-FileWriter veya OutputStream-FileOutputStream kullanılabilir.

Çıktıyı formatlı olarak yazdırmak için JsonGeneratorFactory aşağıdaki gibi kullanılabilir.

var config = Map.ofEntries(Map.entry(JsonGenerator.PRETTY_PRINTING, "true"));
Json.createGeneratorFactory(config).createGenerator(System.out)
// önceki kodlar

Okuma işlemi için JsonParser arayüzü kullanılır.

Stream Model API tek yönlü okumayı next ile yapar ve JsonParser arayüzünde yer alan getValue, getArray, getObject, getString, getInt, getLong, getBigDecimal gibi metotlarla okumanın yapıldığı alana ait değere ulaşılır.

public class App {

    public static void main(String[] args) {

        String json = """
                    {"kisiler": [
                        { "sira": "1", "adi": "Yusuf", "soyadi": "Sezer" },
                        { "sira": "2", "adi": "Ramazan", "soyadi": "Sezer" },
                        { "sira": "3", "adi": "Sinan", "soyadi": "Sezer" },
                        { "sira": "4", "adi": "Mehmet", "soyadi": "Sezer" }
                    ]}
                    """;

        JsonParser parser = Json.createParser(new StringReader(json));
        while (parser.hasNext()) {
            switch (parser.next()) {
                case START_ARRAY -> System.out.println();
                case KEY_NAME -> System.out.print(parser.getString() + " : ");
                case VALUE_STRING, VALUE_NUMBER -> System.out.println(parser.getString());
            }
        }
        parser.close();

    }
}

JsonParser arayüzünde yer alan getArrayStream ve getObjectStream metotları Java 8 ile birlikte gelen Stream API yöntemine göre işlem yapmayı sağlar.

while (parser.hasNext()) {
    switch (parser.next()) {
        case START_ARRAY -> parser
                    .getArrayStream()
                    .forEach(System.out::println);
    }
}

Object Model API tüm veriyi belleğe yüklediğinden küçük boyutlu JSON dosyalarında kullanımı faydalı olacaktır.

Stream Model API sadece işlem yapılan yeri belleğe yüklediğinden büyük boyutlu JSON dosyalarında kullanımı faydalı olacaktır.

JSON-B

JSON-B veya JSON Binding nesneleri JSON formatına çevirmek veya JSON formatındaki ifadeleri Java nesnelerine çevirme işleminde kullanılır.

JSON işlemleri için JsonbBuilder arayüzünden elde edilen Jsonb arayüzü kullanılır.

Arayüz içerisinde yer alan toJson ile nesneleri JSON ifadesine çevirme, fromJson ise JSON ifadesini Java sınıflarına çevirmek için kullanılır.

public class App {

    public static void main(String[] args) {

        Jsonb jsonb = JsonbBuilder.create();
        String list = jsonb.toJson(List.of("Yusuf", "Sefa", "Sezer"));
        String set = jsonb.toJson(Set.of("Yusuf", "Sefa", "Sezer"));
        String map = jsonb.toJson(Map.ofEntries(
                Map.entry("id", "1"),
                Map.entry("adi", "Yusuf"),
                Map.entry("soyadi", "Yusuf")));

        System.out.println(list);
        System.out.println(set);
        System.out.println(map);

    }
}

Yukarıdaki örnekte Java koleksiyonları JSON formatına çevrilmiştir.

Çıktı formatlama, tarihi formatlama ve girintiyi belirleme gibi ayarlar için JsonbConfig aşağıdaki gibi kullanılır.

public class App {

    public static void main(String[] args) throws Exception {

        JsonbConfig config = new JsonbConfig();
        config.withFormatting(true);
        config.withDateFormat("yyyy-MM-dd", Locale.getDefault());
        config.withPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);

        Jsonb jsonb = JsonbBuilder.create(config);
        String list = jsonb.toJson(List.of("Yusuf", "Sefa", "Sezer"));
        String set = jsonb.toJson(Set.of("Yusuf", "Sefa", "Sezer"));
        String map = jsonb.toJson(Map.ofEntries(
                Map.entry("id", "1"),
                Map.entry("adi", "Yusuf"),
                Map.entry("soyadi", "Yusuf")));

        System.out.println(list);
        System.out.println(set);
        System.out.println(map);
    }
}

JSONB ile Java nesnelerinin JSON ifadesine çevirmek için aşağıdaki adımlar takip edilir.

public class Person {

    private long id;
    private String firstName;
    private String lastName;

    // constructor-getter-setter

}

Sınıfın bir örneğini oluşturup toJson metoduna parametre olarak verdiğimizde bize JSON formatında String değer verecektir.

public class App {

    public static void main(String[] args) throws Exception {

        JsonbConfig config = new JsonbConfig();
        config.withFormatting(true);
        config.withDateFormat("yyyy-MM-dd", Locale.getDefault());
        config.withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES);

        Jsonb jsonb = JsonbBuilder.create(config);
        Person person = new Person(1, "Yusuf", "Sezer");
        System.out.println(person);
        String jsonStr = jsonb.toJson(person);
        System.out.println(jsonStr);

    }
}

JSON formatındaki ifadeyi Java nesnesine çevirmek için fromJson metodu kullanılır.

public class App {

    public static void main(String[] args) throws Exception {

        JsonbConfig config = new JsonbConfig();
        config.withFormatting(true);
        config.withDateFormat("yyyy-MM-dd", Locale.getDefault());
        config.withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES);
        Jsonb jsonb = JsonbBuilder.create(config);

        // nesne oluştur
        Person person = new Person(1, "Yusuf", "Sezer");
        System.out.println(person);

        // json çevir
        String jsonStr = jsonb.toJson(person);
        System.out.println(jsonStr);

        // pojo çevir
        Person newPerson = jsonb.fromJson(jsonStr, Person.class);
        System.out.println(newPerson);

    }
}

Elde edilen değerlerle yeni bir nesne oluşturulacaktır.

Sınıf içerisinde yer alan özelliklere annotations kullanarak düzenlemeler yapılabilir.

Annotations hakkında detaylı bilgi için Java Annotations yazıma bakmalısın.

@JsonbPropertyOrder({"id", "firstName", "lastName"})
public class Person {

    @JsonbProperty("sira")
    private long id;
    @JsonbProperty("adi")
    private String firstName;
    @JsonbProperty("soyadi")
    private String lastName;
    //@JsonbTransient veya
    public transient BigDecimal salary = BigDecimal.ONE;

    // constructor-getter-setter

}

JSONB arayüzünden yer alan toJson ve fromJson metotları OutputStream, Writer, InputStream ve Reader sayesinde farklı veri kaynakları ile çalışmayı sağlar.

public class App {

    public static void main(String[] args) throws Exception {

        Jsonb jsonb = JsonbBuilder.create();
        URL url = URI.create("https://jsonplaceholder.typicode.com/posts").toURL();

        List posts = jsonb.fromJson(url.getInputStream(), List.class);
        posts.forEach(System.out::println);

    }
}

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir


Destek almak için tıklayın.