Jackson — це дуже поширена бібліотека для обробки JSON і серіалізації/десеріалізації загалом у проектах на основі Java та Spring Boot.
Джексон обробляє імена властивостей, зіставляючи їх як вони є з JSON – отже
propertyName
у POJO матиме відповідникpropertyName
у форматі JSON. Ця угода також дотримується під час перетворення JSON на POJO, і якщо імена не збігаються, перетворення не можна виконати.
Однак є багато випадків, коли ви бажаєте, щоб серіалізовані властивості JSON мали різні імена, наприклад, стандартизуючи угоди про іменування для інших служб (використовуючи такі випадки, як snake_case
, замість CamelCase
) або суперечливі назви властивостей (a Customer
може мати firstName
, просто як Agent
– і звіт може містити обидва з них firstName
властивості та потребує серіалізації).
Давайте створимо а Book
з кількома простими полями:
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 за допомогою Джексона
При звичайному перетворенні екземпляра a Book
у JSON, ми записали б значення об’єкта як рядок JSON за допомогою ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Це призводить до:
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
Команда title
, author
та releaseYear
є відображенням 1 до 1 до title
, author
та releaseYear
поля POJO. Щоб змінити назву властивості JSON і зберегти її після серіалізації, не потрібно змінювати POJO! Достатньо зробити примітку до відповідного поля @JsonProperty
і введіть назву JSON:
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;
}
}
Тепер, коли ми створюємо об’єкт і перетворюємо його на JSON:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
Результат коду:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
Змінити назви полів JSON під час перетворення JSON на POJO?
Варто зазначити, що зміна назви не є односторонньою. Та сама анотація працює в обох напрямках і може поєднати вхідний JSON з різними іменами в дійсний об’єкт. Наприклад, JSON, що представляє книгу з book_title
, не буде зіставлено з title
власність Book
за замовчуванням, оскільки вони не однакові.
Оскільки ми зробили анотацію title
as book_title
– перетворення працює чудово:
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
Це призводить до:
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
Примітка: Щоб побудувати об’єкт із JSON, у вашому класі також повинен бути порожній конструктор. Джексон спочатку створює екземпляр порожнього об’єкта, а потім заповнює поля за допомогою геттерів і сеттерів.
Анотуйте Getters і Setters за допомогою @JsonProperty
Ви хочете закодувати різні імена для серіалізації та десеріалізації? Наприклад, ви можете серіалізувати Book
у JSON з bt
позначає назву книги, але споживає JSON з book_title
. Ви можете налаштувати геттери та сетери для Book
клас с @JsonProperty
анотації:
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
Таким чином, при серіалізації, getBt()
метод серіалізує title
як bt
поле в JSON. Під час читання з JSON (десеріалізація) вам потрібно буде надати a book_title
, який зіставляється з title
.
Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!
Примітка: обидві bt
та book_title
буде відображено в title
поле, але це не робить bt
та book_title
взаємозамінні. Джексон не зможе конвертувати між ними без попереднього конвертування в title
.
Тепер ви можете створити екземпляр книги, серіалізувати її та десеріалізувати інший рядок у книгу за допомогою:
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);
Це призводить до:
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
Висновок
У цьому короткому посібнику ми розглянули, як Джексон зіставляє поля об’єктів із JSON і як можна змінити ім’я полів перед серіалізацією. Ми також досліджували ідею використання різних імен JSON для серіалізації та десеріалізації, використовуючи @JsonProperty
анотація на рівні методу, а не на рівні поля.