Jackson, Java ve Spring Boot tabanlı projelerde genel olarak JSON ve seri hale getirme/seri hale getirmeyi işlemek için çok yaygın bir kütüphanedir.
Jackson, özellik adlarını JSON'a olduğu gibi eşleyerek işler - yani
propertyName
bir POJO'da karşılık gelen birpropertyName
JSON'da. JSON'u POJO'ya dönüştürürken de bu kurala uyulur ve adlar eşleşmezse dönüştürme yapılamaz.
Ancak, seri hale getirilmiş JSON özelliklerinin farklı adlara sahip olmasını isteyebileceğiniz birçok durum vardır; örneğin, diğer hizmetler için adlandırma kurallarını standart hale getirmek (örneğin, snake_case
, Yerine CamelCase
) veya çakışan özellik adları (bir Customer
olabilir firstName
, tıpkı bir Agent
– ve bir rapor her ikisini de içerebilir firstName
özellikleri ve seri hale getirilmesi gerekiyor).
Hadi bir Book
sınıf, birkaç basit alanla:
public class Book {
private String title;
private String author;
private int releaseYear;
public Book() {}
public Book(String title, String author, int releaseYear) {
this.title = title;
this.author = author;
this.releaseYear = releaseYear;
}
}
JSON Alan Adlarını Jackson ile Değiştirin
Genellikle bir örneğini dönüştürürken Book
JSON'a, nesnenin değerini kullanarak bir JSON dizesi olarak yazardık. ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Bunun sonucu:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
The title
, author
ve releaseYear
için 1'e 1 eşlemedir. title
, author
ve releaseYear
POJO alanları. Bir JSON özelliğinin adını değiştirmek ve serileştirmeden sonra onu korumak için POJO'nuzu değiştirmenize gerek yoktur! ile ilgili alana açıklama eklemeniz yeterlidir. @JsonProperty
, ve JSON adını girin:
public class Book {
@JsonProperty("book_title")
private String title;
@JsonProperty("book_author")
private String author;
@JsonProperty("book_release_year")
private int releaseYear;
public Book(){}
public Book(String title, String author, int releaseYear) {
this.title = title;
this.author = author;
this.releaseYear = releaseYear;
}
}
Şimdi, nesneyi başlatıp JSON'a dönüştürdüğümüzde:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Kod şu şekilde sonuçlanır:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
JSON'dan POJO'ya Dönüştürmede JSON Alan Adları Değiştirilsin mi?
İsim değişikliğinin tek taraflı olmadığını belirtmekte fayda var. Aynı ek açıklama her iki şekilde de çalışır ve farklı adlara sahip gelen bir JSON'u geçerli bir nesneye köprüleyebilir. Örneğin, bir kitabı temsil eden bir JSON book_title
, ile eşlenmeyecek title
mülkiyeti Book
sınıf, aynı olmadıkları için varsayılan olarak.
Açıklama yaptığımızdan title
as book_title
– dönüştürme gayet iyi çalışıyor:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Bunun sonucu:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Not: JSON'dan bir nesne oluşturmak için sınıfınızın da boş bir kurucuya sahip olması gerekir. Jackson önce boş nesneyi başlatır ve ardından alıcıları ve ayarlayıcıları kullanarak alanları doldurur.
Alıcılara ve Ayarlayıcılara @JsonProperty ile Açıklama Ekleyin
Serileştirme ve seri kaldırma için farklı adlar kodlamak istiyor musunuz? Örneğin, seri hale getirebilirsiniz Book
ile bir JSON'a bt
kitabın başlığını belirtmek, ancak JSON'u şununla kullanın: book_title
. Alıcılarını ve ayarlayıcılarını özelleştirebilirsiniz. Book
ile sınıf @JsonProperty
ek açıklamalar:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
Bu şekilde, serileştirildiğinde, getBt()
yöntem serileştirecek title
bir şekilde bt
JSON'daki alan. JSON'dan okurken (serileştirme), bir book_title
, eşlenen title
.
En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!
Not: Her ikisi de bt
ve book_title
haritalandırılacak title
alan, ancak bu yapmaz bt
ve book_title
değiştirilebilir Jackson, önce şuna dönüştürmeden aralarında dönüşüm gerçekleştiremez: title
.
Artık bir kitabı başlatabilir, seri hale getirebilir ve başka bir String'in serisini kaldırarak bir kitap haline getirebilirsiniz:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
String input = "{"author":"Max Tegmark","releaseYear":2017,"book_title":"Life 3.0"}";
Book bookReconstructed = mapper.readValue(input, Book.class);
System.out.print(bookReconstructed);
Bunun sonucu:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
Sonuç
Bu kısa eğitimde, Jackson'ın nesne alanlarını JSON'a nasıl eşlediğine ve serileştirmeden önce alanların adını nasıl değiştirebileceğinize bir göz attık. Ayrıca, serileştirme ve seriden kaldırma için farklı JSON adları kullanma fikrini de araştırdık. @JsonProperty
alan düzeyinden ziyade yöntem düzeyinde açıklama.