Змініть назву поля JSON за допомогою Джексона в Java

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 анотація на рівні методу, а не на рівні поля.

Часова мітка:

Більше від Stackabuse