ในคืนฤดูใบไม้ผลิที่หนาวเย็น ในที่สุดฉันก็ไปถึงระดับ 33 แล้ว เมื่อถูมือโปรแกรมเมอร์ของฉัน ฉันกำลังเตรียมพร้อมที่จะยอมรับสาขาทั้งหมดของการซีเรียลไลซ์เซชันและดีซีเรียลไลเซชันของ JSON แต่น่าเสียดายที่ฉันไม่เข้าใจอะไรเลย ฉันจำเนื้อหาในการบรรยายไม่ได้ แต่ปัญหาได้รับการแก้ไขอย่างสังหรณ์ใจ ในเรื่องนี้ ฉันตัดสินใจที่จะเจาะลึกเข้าไปในส่วนเสริมของ Jackson Framework และค้นหาว่า JSON นี้คืออะไร
ฉันจะพยายามนำเสนอความรู้ทั้งหมดของฉันในทางปฏิบัติและรัดกุมในรูปแบบแผ่นโกง (ทั้งสำหรับตัวฉันเองและสำหรับผู้อ่าน) การเดินทางสู่คำอธิบายประกอบของแจ็คสัน สิ่งแรกที่เราพบระหว่างทางไป JSON คือคำอธิบายประกอบ @JsonAutoDetect เมื่อมองแวบแรก นี่เป็นบทสรุปที่ง่าย แต่ผู้เขียนใช้เวลานานที่สุดในการเข้าใจ นามธรรมมี 5 วิธีที่เราต้องการ:
- fieldVisibility () - ทำให้เป็นอนุกรมเฉพาะฟิลด์ที่มีตัวแก้ไขการเข้าถึงที่ระบุ
- getterVisibility()/setterVisibility() - ทำให้ฟิลด์เป็นอนุกรมที่ getter/setter มีตัวแก้ไขการเข้าถึงที่ระบุ
- isGetterVisibility() - การใช้งานแยกต่างหากสำหรับ getters บูลีน
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
isGetterVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
private Map<String, String> properties;
public Queue<String> queue;
protected List<String> list;
private int age;
private int number;
private boolean isHead;
protected HeadClass(int age) {
this.age = age;
}
public HeadClass() {}
Map<String, String> getProperties() {
return properties;
}
protected boolean isHead() {
return isHead;
}
protected void setProperties(Map<String, String> properties) {
this.properties = properties;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
จะเกิดอะไรขึ้นถ้าเราลบ isGetterVisibility ออก? วิธีการทั้งสี่ที่ระบุไว้ได้กำหนดค่ากระบวนการซีเรียลไลซ์ ประการที่ห้าจะควบคุมกระบวนการดีซีเรียลไลเซชัน:
- creatorVisibility()เป็นวิธีการที่เข้าใจยากที่สุด มันทำงานร่วมกับตัวสร้างและวิธีการของโรงงาน (วิธีการที่สร้างวัตถุเมื่อถูกเรียก) ลองดูตัวอย่าง:
@JsonAutoDetect(creatorVisibility = JsonAutoDetect.Visibility.PROTECTED_AND_PUBLIC)
public class HeadClass {
public String name;
public int id;
HeadClass(@JsonProperty(value = "name") String name, @JsonProperty(value = "id") int id) {
this.name = name;
this.id = id;
}
protected HeadClass(String name) {
this.name = name;
this.id = 123;
}
protected HeadClass(int id) {
this.id = id;
this.name = "Yes!";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String forDeserialize = "{\"name\":\"No!\",\"id\":123}";
StringReader reader = new StringReader(forDeserialize);
HeadClass headClass1 = (HeadClass) mapper.readValue(reader, HeadClass.class);
}
หมายเหตุสำคัญเกี่ยวกับกลไกการดีซีเรียลไลซ์! เมื่อเราพยายามสร้างวัตถุจาก JSON ตัวสร้างของคลาสที่ต้องการจะถูกค้นหาด้วยชุดพารามิเตอร์เดียวกันกับในวัตถุ JSON ในตัวอย่างข้างต้น ออบเจ็กต์ JSON ของเราประกอบด้วยพารามิเตอร์ 2 ตัว ได้แก่ name, id เดาว่ามันจะเรียกคอนสตรัคเตอร์ตัวไหน ใช่ครับ ถ้าเราคอมไพล์โค้ดนี้ มันก็จะ error ออกมา เพราะอะไร? เนื่องจากเราจำกัดการมองเห็นของตัวสร้าง (เฉพาะตัวสร้างที่มีการป้องกันและตัวดัดแปลงสาธารณะเท่านั้นที่มองเห็นได้) หากคุณลบ creatorVisibility ออก มันจะใช้งานได้ คำถามเกิดขึ้น @JsonProperty ในตัวสร้างคืออะไร? ฉันคิดว่าฉันจะพูดถึงเรื่องนี้ในส่วนถัดไปของบทความ ป.ล.สุภาพบุรุษ อย่างน้อยฉันก็อยากได้คำตอบเกี่ยวกับบทความนี้จริงๆ ฉันสงสัยว่าหัวข้อนี้เป็นที่ต้องการหรือไม่และคุ้มค่าที่จะดำเนินการต่อหรือไม่เนื่องจากมีหัวข้อมากมายและน่าสนใจมากทั้งหมด ฉันต้องการพิจารณาคำอธิบายประกอบเช่น @JsonView, @JsonManagedReference, @JsonBackReference, @JsonUnwrapped เป็นต้น ขอบคุณ :)
GO TO FULL VERSION