Jackson punika perpustakaan populer kanggo serializing / deserializing obyek Jawa menyang macem-macem format teks. Kelas ObjectMapper minangka cara utama perpustakaan kanggo nggarap format JSON. Kanggo format liyane, kita duwe turunane ( XmlMapper , YAMLMapper ). Thanks kanggo warisan, kita bisa nggarap kabeh format kanthi cara sing konsisten, liwat antarmuka siji.

Unduh file jar

Sadurunge sinau conto, kita kudu ngundhuh file jar Jackson lan nyambung menyang project ing IntelliJ IDEA. Ayo njupuk conto jackson-databind kanggo ndeleng carane nggoleki file sing dibutuhake:

  1. Pindhah menyang situs web Repositori Maven .

  2. Ketik " jackson-databind " menyang kothak panelusuran. Sampeyan bakal entuk ing ngisor iki:

  3. Asil telusuran pisanan yaiku apa sing kita minati. Tindakake tautan kasebut.

  4. Kadhangkala versi perpustakaan tartamtu bisa uga dibutuhake kanggo njamin kompatibilitas karo komponen liyane ing sawijining proyek. Versi paling anyar kudu bisa digunakake (nalika nulis pelajaran iki, yaiku 2.13.2.2). Tindakake link.

  5. Ing kaca sing mbukak, sampeyan pengin link "bundel":

  6. Download file jar nggunakake link iki .

Sawise prosedur sing padha, sampeyan bisa nemokake lan ndownload file jar liyane sing dibutuhake:

Sawise ndownload kabeh file sing dibutuhake, sambungake menyang proyek ing IntelliJ IDEA:

  1. Bukak setelan proyek (sampeyan bisa nindakake kanthi kombinasi tombol Ctrl + Alt + Shift + S ).

  2. Pindhah menyang Pustaka .

  3. Pencet + banjur "Jawa". Pilih kabeh file sing diundhuh. Mangkene apa sing kudu kita lakoni:

  4. Sing rampung karya preparatory kita. Saiki kita bisa nyoba ObjectMapper ing tumindak.

Serialisasi menyang JSON

Pisanan, ayo nggawe serial sawetara obyek menyang JSON:


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);
	}
}

Running main bakal menehi output iki:

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

ObjectMapper duwe akeh setelan canggih . Ayo gunakake salah sijine supaya string JSON luwih bisa diwaca. Sawise nggaweObjectMapperobyek, nglakokaké statement iki:

mapper.enable(SerializationFeature.INDENT_OUTPUT);

Informasi ing output tetep padha, nanging saiki ana indentation lan baris break:

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

Deserialisasi saka JSON

Saiki ayo tumindak ngelawan: kita bakal deserialize senar menyang obyek. Supaya bisa ndeleng apa sing ditindakake program, ayo ngganti metode toString ing kelas Buku :


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

Lan kita bakal nindakake ing ngisor iki ing cara utama :


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);
}

Output:

Buku{title='Good Omens', author='Pratchett T., Gaiman N.', pages=383}

Cara readValue overloaded - akeh variasi sing njupuk file, link, macem-macem aliran input, etc.. Kanggo kesederhanaan, conto kita nggunakake varian sing nampa string JSON.

Kaya kasebut ing ndhuwur, ObjectMapper duwe akeh setelan. Ayo padha ndeleng sawetara.

Nglirwakake sifat sing ora dingerteni

Coba kahanan ing ngendi string JSON duwe properti sing ora ana ing kelas Buku :


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);
}

Nglakokake kode iki menehi kita UnrecognizedPropertyException . Iki minangka prilaku standar, nanging kita bisa ngganti:


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

Nalika nggawe aObjectMapperobyek, kita nggunakake cara konfigurasi kanggo nyetel setelan sing cocog kanggo false . Cara konfigurasi ngowahi obyek sing diarani banjur ngasilake obyek sing padha, supaya kita bisa nelpon kanthi cara sing beda:


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

Ing babagan fungsi, notasi iki kaya sing sadurunge.

Yen saiki kita mbukak cara utama , deseralisasi bakal sukses lan properti sing ora dingerteni bakal diabaikan.

Anotasi sing trep

Jackson nyedhiyakake sawetara anotasi sing ngidini kita ngatur proses serialisasi kanthi macem-macem cara. Ayo goleki sawetara sing paling migunani:

@JsonIgnore - Anotasi iki diselehake ing ndhuwur unsur sing kudu diabaikan sajrone serialisasi / deserialisasi:


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

Ing kenepengaranglapangan ora bakal kalebu ing JSON asil sak serialization. Sawise deserialization, ingpengaranglapangan bakal entuk nilai standar (null), sanajan JSON duweni nilai sing beda.

@JsonFormat - Anotasi iki ngidini sampeyan nyetel format data serial. Ayo ditambahake siji lapangan maneh, Tanggal , menyang kelas Buku :


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

Sawise serialisasi, kita entuk JSON ing ngisor iki:

 {
  "title" : "Good Omens",
  "author" : "Pratchett T., Gaiman N.",
  "pages" : 383,
  "CreatedDate" : 1649330880788
}

Nalika sampeyan bisa ndeleng, tanggal iki serialized minangka nomer. Kita bakal nambah anotasi lan nyetel format:


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();
}

Saiki asil serialisasi yaiku:

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

@JsonProperty - Anotasi iki ngidini sampeyan ngganti jeneng properti sing makili kolom serial. Sampeyan uga bisa menehi tandha cara nganggo anotasi iki. Yen sampeyan nindakake, nilai baline bakal diowahi dadi properti JSON sajrone serialisasi:


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

Hasil seralisasi:

{
  "penulis" : "Pratchett T., Gaiman N.",
  "pages" : 383,
  "name" : "Good Omens",
  "quotedTitle" : "\"Good Omens\""
}

@JsonInclude - Nggunakake anotasi iki, sampeyan bisa nemtokake kahanan sing kudu dicukupi kanggo lapangan supaya bisa serial. Sampeyan bisa aplikasi ing lapangan individu utawa kabeh kelas. Pisanan, ayo nyoba nggawe serial obyek kanthi kolom sing ora diinisialisasi:


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);
	}
}

Hasil seralisasi:

{
  "judul": null,
  "penulis": null,
  "kaca": 0
}

Lan yen sampeyan nambah anotasi:


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

Banjur kita entuk asil iki:

{
  "kaca": 0
}

Saiki kolom sing null ora serialized.

@JsonPropertyOrder - Anotasi iki ngidini sampeyan ngeset urutan kolom sing disusun:


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

Hasil seralisasi:

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

Saiki, mung elinga carane nggunakake anotasi. Ing pungkasan modul iki, kita bakal luwih ngerti lan malah nggawe anotasi dhewe.

Serialisasi lan deserialization ing XML

Yen kita kudu serialize menyang XML, kita bisa nggunakake kabeh setelan lan anotasi padha. Bentenipun mung bakal implementasine sakaobyek mapper:


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);
}

Output:

 <Book>
  <title>Good Omens</title>
  <penulis>Pratchett T., Gaiman N.</author>
  <kaca>383</pages>
</Book>

Deserialisasi XML:


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);
}

Serialisasi lan deseralisasi ing YAML

Kita nangani YAML kanthi cara sing padha nangani XML:


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);
}

Output:

---
judhul: "Good Omens"
penulis: "Pratchett T., Gaiman N."
kaca: 383

Deserialisasi YAML:


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);
}