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
คำอธิบายประกอบในระดับเมธอด แทนที่จะเป็นระดับฟิลด์