Jackson, Java nesnelerini çeşitli metin biçimlerine serileştirmek/seri durumdan çıkarmak için popüler bir kitaplıktır. ObjectMapper sınıfı , kitaplığın JSON biçimiyle çalışmanın ana yoludur. Diğer biçimler için onun soyundan gelenlere sahibiz ( XmlMapper , YAMLMapper ). Kalıtım sayesinde tek bir arayüz üzerinden tüm formatlarla tutarlı bir şekilde çalışabiliyoruz.

jar dosyalarını indir

Örnekleri incelemeden önce Jackson jar dosyalarını indirip IntelliJ IDEA'daki projeye bağlamamız gerekiyor. Gerekli dosyaların nasıl aranacağını görmek için jackson-databind örneğini ele alalım :

  1. Maven Deposu web sitesine gidin .

  2. Arama kutusuna " jackson-databind " yazın . Aşağıdakileri alacaksınız:

  3. İlk arama sonucu ilgilendiğimiz şeydir. Bağlantıyı takip edin.

  4. Bazen bir projedeki diğer bileşenlerle uyumluluğu sağlamak için bir kitaplığın belirli bir sürümü gerekebilir. En son sürüm çalışmalıdır (bu ders yazıldığı sırada 2.13.2.2'dir). Linki izle.

  5. Açılan sayfada "paket" bağlantısını istiyorsunuz:

  6. Bu bağlantıyı kullanarak jar dosyasını indirin .

Benzer bir prosedürü izleyerek, gerekli jar dosyalarının geri kalanını bulabilir ve indirebilirsiniz:

Gerekli tüm dosyaları indirdikten sonra, bunları IntelliJ IDEA'daki projeye bağlayın:

  1. Proje ayarlarını açın ( Ctrl+Alt+Shift+S tuş kombinasyonu ile yapabilirsiniz ).

  2. Kitaplıklar'a gidin .

  3. + ve ardından "Java"ya basın . İndirilen tüm dosyaları seçin. İşte bitirmemiz gereken şey:

  4. Böylece hazırlık çalışmamız sona eriyor. Artık ObjectMapper'ı çalışırken deneyebiliriz .

JSON'a seri hale getirme

İlk olarak, bazı nesneleri JSON'a seri hale getirelim:


import com.fasterxml.jackson.databind.ObjectMapper;
 
class Book {
	public String title;
	public String author;
	public int pages;
}
 
public class Solution {
	public static void main(String[] args) throws Exception {
    	Book book = new Book();
    	book.title = "Good Omens";
    	book.author = "Pratchett T., Gaiman N.";
    	book.pages = 383;
 
    	ObjectMapper mapper = new ObjectMapper();
    	String jsonBook = mapper.writeValueAsString(book);
    	System.out.println(jsonBook);
	}
}

main'i çalıştırmak size şu çıktıyı verecektir:

{"title":"Good Omens","yazar":"Pratchett T., Gaiman N.","pages":383}

ObjectMapper birçok gelişmiş ayara sahiptir . JSON dizesini daha okunabilir hale getirmek için bunlardan birini kullanalım. oluşturduktan sonraNesne Eşleyicinesne, bu ifadeyi yürütün:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

Çıktıdaki bilgiler aynı kalır, ancak artık girintiler ve satır sonları vardır:

{
  "title" : "Good Omens",
  "yazar" : "Pratchett T., Gaiman N.",
 "sayfalar" : 383
}

JSON'dan seri kaldırma

Şimdi ters işlemi yapalım: bir diziyi bir nesneye seri hale getireceğiz. Programın ne yaptığını görebilmek için Book sınıfında toString metodunu geçersiz kılalım :


@Override
public String toString() {
	return "Book{" +
        	"title='" + title + '\'' +
        	", author='" + author + '\'' +
        	", pages=" + pages +
        	'}';
}

Ve ana yöntemde şunları yapacağız :


public static void main(String[] args) throws Exception {
	String jsonString = "{\"title\":\"Good Omens\",\"author\":\"Pratchett T., Gaiman N.\",\"pages\":383}";
	Book book = new ObjectMapper().readValue(jsonString, Book.class);
	System.out.println(book);
}

Çıktı:

Kitap{title='Good Omens', Author='Pratchett T., Gaiman N.', sayfalar=383}

readValue yöntemi aşırı yüklenmiştir — bir dosya, bağlantı, çeşitli giriş akışları vb. alan birçok varyasyonu vardır. Basit olması açısından, örneğimizde bir JSON dizesini kabul eden bir değişken kullanılmıştır .

Yukarıda bahsedildiği gibi, ObjectMapper'ın birçok ayarı vardır. Bunlardan birkaçına bakalım.

Bilinmeyen özellikleri yoksayma

Bir JSON dizesinin Book sınıfında olmayan bir özelliğe sahip olduğu bir durumu göz önünde bulundurun :


public static void main(String[] args) throws Exception {
	String jsonString = """
        	{
          	"title" : "Good Omens",
          	"author" : "Pratchett T., Gaiman N.",
          	"pages" : 383,
          	"unknown property" : 42
        	}""";
	ObjectMapper mapper = new ObjectMapper();
	Book book = mapper.readValue(jsonString, Book.class);
	System.out.println(book);
}

Bu kodu çalıştırmak bize bir UnrecognizedPropertyException verir . Bu varsayılan davranıştır, ancak bunu değiştirebiliriz:


ObjectMapper mapper =
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

oluştururkenNesne Eşleyicinesne, karşılık gelen ayarı false olarak ayarlamak için configure yöntemini kullanırız . Configure yöntemi, çağrıldığı nesneyi değiştirir ve ardından aynı nesneyi döndürür, böylece bu aramayı farklı bir şekilde yapabiliriz :


ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

İşlevsellik açısından, bu notasyon öncekiyle aynıdır.

Şimdi ana yöntemi çalıştırırsak , seri durumdan çıkarma başarılı olacak ve bilinmeyen özellik göz ardı edilecektir.

Kullanışlı ek açıklamalar

Jackson, seri hale getirme sürecini her türlü şekilde özelleştirmemize izin veren birkaç ek açıklama sağlar. En kullanışlı olanlardan bazılarına bir göz atalım:

@JsonIgnore — Bu ek açıklama, seri hale getirme/seri hale getirme sırasında yok sayılması gereken bir öğenin üzerine yerleştirilmiştir:


class Book {
	public String title;
	@JsonIgnore
	public String author;
	public int pages;
}

buradayazaralan, serileştirme sırasında ortaya çıkan JSON'a dahil edilmeyecektir. seri hale getirme üzerine,yazaralanı, JSON farklı bir değere sahip olsa bile varsayılan değeri (null) alacaktır.

@JsonFormat — Bu ek açıklama, seri hale getirilmiş verilerin biçimini ayarlamanıza olanak tanır. Book sınıfına bir Date alanı daha ekleyelim :


class Book {
	public String title;
	public String author;
	public int pages;
	public Date createdDate = new Date();
}

Serileştirmeden sonra aşağıdaki JSON'u elde ederiz:

 {
  "title" : "Good Omens",
  "yazar" : "Pratchett T., Gaiman N.",
  "sayfalar" : 383,
  "createdDate" : 1649330880788
}

Gördüğünüz gibi tarih bir sayı olarak tefrika edildi. Bir ek açıklama ekleyeceğiz ve formatı ayarlayacağız:


class Book {
	public String title;
	public String author;
	public int pages;
	@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
	public Date createdDate = new Date();
}

Şimdi seri hale getirmenin sonucu:

{
  "title" : "Good Omens",
  "yazar" : "Pratchett T., Gaiman N.",
  "sayfalar" : 383,
  "createdDate" : "2022-04-07"
}

@JsonProperty — Bu ek açıklama, serileştirilmiş alanı temsil eden özelliğin adını değiştirmenize olanak tanır. Bu ek açıklama ile yöntemleri de işaretleyebilirsiniz. Bunu yaparsanız, serileştirme sırasında dönüş değerleri bir JSON özelliğine dönüştürülür:


class Book {
	@JsonProperty("name")
	public String title;
	public String author;
	public int pages;
 
	@JsonProperty("quotedTitle")
	public String getQuotedTitle() {
    	    return "\"" + title + "\"";
	}
}

Seralizasyonun sonucu:

{
  "yazar" : "Pratchett T., Gaiman N.",
  "sayfalar" : 383,
  "ad" : "İyi Omens",
  "quotedTitle" : "\"Good Omens\""
}

@JsonInclude — Bu ek açıklamayı kullanarak, bir alanın serileştirilmesi için karşılanması gereken koşulları belirleyebilirsiniz. Tek tek alanlara veya tüm sınıfa uygulayabilirsiniz. Öncelikle, başlatılmamış alanlarla bir nesneyi seri hale getirmeye çalışalım:


public class Solution {
	public static void main(String[] args) throws Exception {
    		Book book = new Book();

    		ObjectMapper mapper = new ObjectMapper();
    		mapper.enable(SerializationFeature.INDENT_OUTPUT);
    		String jsonBook = mapper.writeValueAsString(book);
    		System.out.println(jsonBook);
	}
}

Seralizasyonun sonucu:

{
  "başlık" : boş,
  "yazar" : boş,
  "sayfalar" : 0
}

Ek açıklamayı eklerseniz:


@JsonInclude(JsonInclude.Include.NON_NULL)
class Book {
	public String title;
	public String author;
	public int pages;
}

Sonra bu sonucu elde ederiz:

{
  "sayfa" : 0
}

Artık boş olan alanlar serileştirilmez.

@JsonPropertyOrder — Bu açıklama, alanların serileştirilme sırasını belirlemenizi sağlar:


@JsonPropertyOrder({"author", "title", "pages"})
class Book {
	public String title;
	public String author;
	public int pages;
}

Seralizasyonun sonucu:

{
  "yazar" : "Pratchett T., Gaiman N.",
  "başlık" : "İyi Omens",
  "sayfalar" : 383
}

Şimdilik, ek açıklamaları nasıl kullanacağınızı unutmayın. Bu modülün sonunda onları daha iyi tanıyacağız ve hatta kendi notlarımızı oluşturacağız.

XML'de serileştirme ve seri durumdan çıkarma

XML'de serileştirmemiz gerekirse, aynı ayarları ve ek açıklamaları kullanabiliriz. Tek fark, uygulanması olacaktır.eşleyici nesnesi:


public static void main(String[] args) throws Exception {
	Book book = new Book();
	book.title = "Good Omens";
	book.author = "Pratchett T., Gaiman N.";
	book.pages = 383;
 
	ObjectMapper mapper = new XmlMapper();
	mapper.enable(SerializationFeature.INDENT_OUTPUT);
	String xmlBook = mapper.writeValueAsString(book);
	System.out.println(xmlBook);
}

Çıktı:

 <Kitap>
  <title>İyi Kehanetler</title>
  <yazar>Pratchett T., Gaiman N.</author>
  <pages>383</pages>
</Kitap>

XML'in seri hale getirilmesi:


public static void main(String[] args) throws Exception {
   String xmlString = """
            <Book>
             <title>Good Omens</title>
             <author>Pratchett T., Gaiman N.</author>
             <pages>383</pages>
           </Book>""";
   ObjectMapper mapper = new XmlMapper();
   Book book = mapper.readValue(xmlString, Book.class);
   System.out.println(book);
}

YAML'de serileştirme ve seri durumdan çıkarma

YAML'yi, XML'i ele aldığımız gibi ele alıyoruz:


public static void main(String[] args) throws Exception {
	Book book = new Book();
	book.title = "Good Omens";
	book.author = "Pratchett T., Gaiman N.";
	book.pages = 383;
 
	ObjectMapper mapper = new YAMLMapper();
	mapper.enable(SerializationFeature.INDENT_OUTPUT);
	String yamlBook = mapper.writeValueAsString(book);
	System.out.println(yamlBook);
}

Çıktı:

---
başlık: "Good Omens"
yazarı: "Pratchett T., Gaiman N."
sayfalar: 383

YAML'nin seri hale getirilmesi:


public static void main(String[] args) throws Exception {
   String yamlString = """
           ---
           title: "Good Omens"
           author: "Pratchett T., Gaiman N."
           pages: 383""";
   ObjectMapper mapper = new YAMLMapper();
   Book book = mapper.readValue(yamlString, Book.class);
   System.out.println(book);
}