เปลี่ยนชื่อฟิลด์ JSON ด้วย Jackson ใน Java

Jackson เป็นไลบรารีทั่วไปสำหรับจัดการ JSON และการทำให้เป็นอนุกรม/ดีซีเรียลไลเซชันโดยทั่วไปในโปรเจ็กต์ที่ใช้ Java และ Spring Boot

Jackson จัดการชื่อพร็อพเพอร์ตี้โดยการจับคู่กับ JSON ดังนั้น propertyName ใน POJO จะมีที่สอดคล้องกัน propertyName ใน JSON มีการปฏิบัติตามข้อตกลงนี้เมื่อแปลง JSON เป็น POJO ด้วย และหากชื่อไม่ตรงกัน การแปลงจะไม่สามารถทำได้

อย่างไรก็ตาม มีหลายกรณีที่คุณต้องการให้คุณสมบัติ JSON แบบอนุกรมมีชื่อต่างกัน เช่น การกำหนดมาตรฐานการตั้งชื่อแบบแผนสำหรับบริการอื่นๆ (โดยใช้กรณีเช่น snake_case, แทน CamelCase) หรือชื่อคุณสมบัติที่ขัดแย้งกัน (a Customer สามารถมี firstNameเช่นเดียวกับ an 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 ด้วย Jackson

เมื่อมักจะแปลงอินสแตนซ์ของ 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-to-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

ใส่คำอธิบายประกอบ Getters และ Setters ด้วย @JsonProperty

คุณต้องการเข้ารหัสชื่อที่แตกต่างกันสำหรับการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์เซชันหรือไม่? ตัวอย่างเช่น คุณสามารถทำให้เป็นอันดับ Book เป็น JSON ด้วย bt หมายถึงชื่อหนังสือ แต่ใช้ JSON ด้วย book_title. คุณสามารถปรับแต่ง getters และ setters ของ 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 ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

หมายเหตุ ทั้งสอง bt และ book_title จะถูกแมปไปยัง title ฟิลด์ แต่สิ่งนี้ไม่ได้ทำให้ bt และ book_title ใช้แทนกันได้ Jackson จะไม่สามารถแปลงระหว่างพวกเขาได้โดยไม่ต้องแปลงเป็น .ก่อน 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}

สรุป

ในบทช่วยสอนสั้นๆ นี้ เราได้มาดูวิธีที่ Jackson จับคู่ฟิลด์ออบเจ็กต์กับ JSON และวิธีเปลี่ยนชื่อฟิลด์ก่อนการทำให้เป็นอนุกรม เรายังได้สำรวจแนวคิดในการใช้ชื่อ JSON ต่างๆ สำหรับการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์เซชันโดยใช้ @JsonProperty คำอธิบายประกอบในระดับเมธอด แทนที่จะเป็นระดับฟิลด์

ประทับเวลา:

เพิ่มเติมจาก สแต็ค