Jackson — bu Java-ob'ektlarini turli matn formatlariga serializatsiya/deserializatsiya qilish uchun mashhur kutubxona. JSON formati bilan ishlash uchun asosiy funksionallik — bu ObjectMapper sinfi. Va boshqa formatlar bilan ishlash uchun esa uning vorislari (XmlMapper, YAMLMapper) yordam beradi. Vorislik tufayli barcha formatlar bilan ishlash bir xilda, yagona interfeys orqali amalga oshiriladi.
Jar-tarlarni yuklash
Namunalarni o'rganishdan oldin, Jackson jar-fayllarini yuklab olishingiz va ularni IntellijIDEA loyihangizga ulashingiz kerak. Kerakli fayllarni qanday topish kerakligini jackson-databind misolida ko'rib chiqaylik:
Maven Repository saytiga o'ting.
Qidiruv satriga “jackson-databind” deb yozing, natijani olasiz:
Birinchi qidiruv natijasi bizni qiziqtiradi, unga o'ting.
Ba'zan kutubxonaning ma'lum bir versiyasi kerak bo'lishi mumkin, shunda loyihaning boshqa komponentlari bilan mos keladi. Sizga oxirgi versiyasi kerak bo'ladi (ma'ruza yozilish vaqtida bu 2.13.2.2), o'sha linkka o'ting.
Ochilgan sahifada “bundle” linki kerak bo'ladi:
![]()
Bu link orqali jar-faylni yuklab olishni boshlaymiz.
Xuddi shunday tarzda boshqa kerakli jar-fayllarni topib yuklab olishingiz mumkin:
Hammasini yuklab bo'lgach, IntellijIDEA loyihangizga ulang:
Loyiha sozlamalarini oching (Ctrl+Alt+Shift+S tugmalar birikmasini ishlating).
Libraries bo'limiga o'ting.
+ tugmasini bosib, Java ni tanlang, yuklab olingan barcha fayllarni tanlang. Natija quyidagicha bo'lishi kerak:
![]()
Shu bilan tayyorgarlik tugadi, ObjectMapper ni amalda sinab ko'ramiz.
JSON ga serializatsiya qilish
Bu safar qandaydir ob'ektni JSON ga serializatsiya qilamiz:
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 = "Обитаемый остров";
book.author = "Стругацкий А., Стругацкий Б.";
book.pages = 413;
ObjectMapper mapper = new ObjectMapper();
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
}
}
main ni ishga tushirganingizda quyidagi chiqishni olasiz:
ObjectMapper'da juda ko'p qo'shimcha sozlamalar mavjud. JSON qatorini o'qilishi uchun formatlaydigan sozlamalardan birini ishlatamiz. ObjectMapper ob'ektini yaratgandan so'ng quyidagi buyruqni bajaramiz:
Chiqishdagi ma'lumotlar o'zgarishsiz qoladi, lekin endi bo'sh joylar va satr o'tishlari qo'shiladi:
"title" : "Обитаемый остров",
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413
}
JSON dan deserializatsiya qilish
Endi teskari ishni bajaramiz: qatorni ob'ektga deserializatsiya qilamiz. Dasturning natijasini baholash uchun Book sinfiga toString metodini qo'shamiz:
@Override
public String toString() {
return "Book{" +
"title='" + title + '\'' +
", author='" + author + '\'' +
", pages=" + pages +
'}';
}
Va quyidagi main ni ishga tushiramiz:
public static void main(String[] args) throws Exception {
String jsonString = "{\"title\":\"Обитаемый остров\",\"author\":\"Стругацкий А., Стругацкий Б.\",\"pages\":413}";
Book book = new ObjectMapper().readValue(jsonString, Book.class);
System.out.println(book);
}
Chiqish:
readValue metodi qatorasiga turli variatsiyalarda mavjud, masalan, fayl, havola, turli oqimlarni qabul qiladi va hokazo. Bizning misolda, soddalashtirish uchun, qator ko'rinishida berilgan JSON qabul qilinadi.
Yuqorida aytib o'tilganidek, ObjectMapper juda ko'p sozlamalarga ega, ba'zilarini ko'rib chiqamiz.
Nomalum xususiyatlarni e'tiborsiz qoldirish
JSON qatorida Book sinfida yo'q bo'lgan xususiyat mavjud bo'lgan holatni ko'rib chiqamiz:
public static void main(String[] args) throws Exception {
String jsonString = """
{
"title" : "Обитаемый остров",
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"unknown property" : 42
}""";
ObjectMapper mapper = new ObjectMapper();
Book book = mapper.readValue(jsonString, Book.class);
System.out.println(book);
}
Bu kodni bajarmoqchi bo'lganingizda, UnrecognizedPropertyException avtomatik paydo bo'ladi. Bunday xatti-harakatlar sukut bo'yicha o'rnatilgan, lekin biz uni o'zgartirishimiz mumkin:
ObjectMapper mapper =
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
ObjectMapper ob'ektini yaratishda configure metodidan foydalanib, kerakli sozlamani false ga o'rnatamiz. configure metodi chaqirilgan ob'ektni o'zgartiradi va ayni shu ob'ektni qaytaradi, shuning uchun undan boshqa usulda ham foydalanish mumkin:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Bunday yozuv amaliy jihatdan oldingi bilan teng.
Agar endi main ni ishga tushirsangiz, deserializatsiya muvaffaqiyatli o'tadi va unknown property e'tiborsiz qoldiriladi.
Qulay annotatsiyalar
Jackson bizga serializatsiyani har tomonlama moslashtirish uchun bir qator annotatsiyalar beradi. Eng muhimlaridan bir nechtasini ko'rib chiqamiz:
@JsonIgnore — serializatsiya/deserializatsiya vaqtida e'tibordan chetda qolishi kerak bo'lgan elementi ustiga qo'yiladi:
class Book {
public String title;
@JsonIgnore
public String author;
public int pages;
}
Nomi author serializatsiyada natijaviy JSON ga kiritilmaydi. Deserializatsiya paytida author maydoni sukut bo'yicha qiymat (null) oladi, hatto JSON'da boshqa qiymat bo'lsa ham.
@JsonFormat — serializatsiyalangan ma'lumotlar formatini belgilash imkonini beradi. Book sinfiga yana bir Date turidagi maydon qo'shamiz:
class Book {
public String title;
public String author;
public int pages;
public Date createdDate = new Date();
}
Serializatsiya qilinishi natijasida quyidagi kabi JSON olamiz:
"title" : "Обитаемый остров",
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"createdDate" : 1649330880788
}
Ko'rganingizdek, sana raqam ko'rinishida serializatsiya qilingan. Annotatsiya qo'shamiz va formatni belgilaymiz:
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();
}
Endi serializatsiya natijasi:
"title" : "Обитаемый остров",
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"createdDate" : "2022-04-07"
}
@JsonProperty — maydon serializatsiya qilinadigan xususiyat nomini o'zgartirish imkonini beradi. Bu annotatsiya metodlar ustiga qo'yilishi mumkin va ularning qaytaradigan qiymati JSON xususiyatiga aylantiriladi:
class Book {
@JsonProperty("name")
public String title;
public String author;
public int pages;
@JsonProperty("quotedTitle")
public String getQuotedTitle() {
return "«" + title + "»";
}
}
Serializatsiya natijasi:
"author" : "Стругацкий А., Стругацкий Б.",
"pages" : 413,
"name" : "Обитаемый остров",
"quotedTitle" : "«Обитаемый остров»"
}
@JsonInclude — bu annotatsiya yordamida maydon qachon serializatsiya qilinishi kerakligini belgilash mumkin. Uni alohida maydonlar va butun sinfga qo'shish mumkin. Avval maydonlari initsializatsiya qilinmagan ob'ektni serializatsiya qilib ko'ramiz:
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);
}
}
Serializatsiya natijasi:
"title" : null,
"author" : null,
"pages" : 0
}
Agar annotatsiyani qo'shsangiz:
@JsonInclude(JsonInclude.Include.NON_NULL)
class Book {
public String title;
public String author;
public int pages;
}
Natija quyidagicha bo'ladi:
"pages" : 0
}
Endi null qiymatga ega maydonlar serializatsiya qilinmagan.
@JsonPropertyOrder — maydonlar serializatsiya tartibini belgilash imkonini beradi:
@JsonPropertyOrder({"author", "title", "pages"})
class Book {
public String title;
public String author;
public int pages;
}
Serializatsiya natijasi:
"author" : "Стругацкий А., Стругацкий Б.",
"title" : "Обитаемый остров",
"pages" : 413
}
Hoziroq annotatsiyalarni qanday ishlatishni eslab qoling, lekin bu modul oxirida ularni batafsilroq o'rganamiz va o'z annotatsiyalarimizni yaratamiz.
XML ga serializatsiya qilish va deserializatsiya qilish
Agar XML formatiga serializatsiya qilish kerak bo'lsa, xuddi o'sha sozlamalar va annotatsiyalardan foydalanishimiz mumkin. Yagona farq mapper ob'ektining implementatsiyasi bo'ladi:
public static void main(String[] args) throws Exception {
Book book = new Book();
book.title = "Обитаемый остров";
book.author = "Стругацкий А., Стругацкий Б.";
book.pages = 413;
ObjectMapper mapper = new XmlMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String xmlBook = mapper.writeValueAsString(book);
System.out.println(xmlBook);
}
Chiqish:
<title>Обитаемый остров</title>
<author>Стругацкий А., Стругацкий Б.</author>
<pages>413</pages>
</Book>
XML'dan deserializatsiya qilish:
public static void main(String[] args) throws Exception {
String xmlString = """
<Book>
<title>Обитаемый остров</title>
<author>Стругацкий А., Стругацкий Б.</author>
<pages>413</pages>
</Book>""";
ObjectMapper mapper = new XmlMapper();
Book book = mapper.readValue(xmlString, Book.class);
System.out.println(book);
}
YAML ga serializatsiya qilish va deserializatsiya qilish
XML bilan qilganimiz kabi YAML bilan ham shunday ishlaymiz:
public static void main(String[] args) throws Exception {
Book book = new Book();
book.title = "Обитаемый остров";
book.author = "Стругацкий А., Стругацкий Б.";
book.pages = 413;
ObjectMapper mapper = new YAMLMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String yamlBook = mapper.writeValueAsString(book);
System.out.println(yamlBook);
}
Chiqish:
title: "Обитаемый остров"
author: "Стругацкий А., Стругацкий Б."
pages: 413
YAML'dan deserializatsiya qilish:
public static void main(String[] args) throws Exception {
String yamlString = """
---
title: "Обитаемый остров"
author: "Стругацкий А., Стругацкий Б."
pages: 413""";
ObjectMapper mapper = new YAMLMapper();
Book book = mapper.readValue(yamlString, Book.class);
System.out.println(book);
}


GO TO FULL VERSION