JavaRush /จาวาบล็อก /Random-TH /บทนำสู่กรอบแจ็คสัน
Mikhail Fufaev
ระดับ
Москва

บทนำสู่กรอบแจ็คสัน

เผยแพร่ในกลุ่ม
ในคืนฤดูใบไม้ผลิที่หนาวเย็น ในที่สุดฉันก็ไปถึงระดับ 33 แล้ว เมื่อถูมือโปรแกรมเมอร์ของฉัน ฉันกำลังเตรียมพร้อมที่จะยอมรับสาขาทั้งหมดของการซีเรียลไลซ์เซชันและดีซีเรียลไลเซชันของ JSON แต่น่าเสียดายที่ฉันไม่เข้าใจอะไรเลย ฉันจำเนื้อหาในการบรรยายไม่ได้ แต่ปัญหาได้รับการแก้ไขอย่างสังหรณ์ใจ ในเรื่องนี้ ฉันตัดสินใจที่จะเจาะลึกเข้าไปในส่วนเสริมของ Jackson Framework และค้นหาว่า JSON นี้คืออะไร
กรอบแจ็คสัน
ฉันจะพยายามนำเสนอความรู้ทั้งหมดของฉันในทางปฏิบัติและรัดกุมในรูปแบบแผ่นโกง (ทั้งสำหรับตัวฉันเองและสำหรับผู้อ่าน) การเดินทางสู่คำอธิบายประกอบของแจ็คสัน สิ่งแรกที่เราพบระหว่างทางไป JSON คือคำอธิบายประกอบ @JsonAutoDetect เมื่อมองแวบแรก นี่เป็นบทสรุปที่ง่าย แต่ผู้เขียนใช้เวลานานที่สุดในการเข้าใจ นามธรรมมี 5 วิธีที่เราต้องการ:
  • fieldVisibility () - ทำให้เป็นอนุกรมเฉพาะฟิลด์ที่มีตัวแก้ไขการเข้าถึงที่ระบุ
  • getterVisibility()/setterVisibility() - ทำให้ฟิลด์เป็นอนุกรมที่ getter/setter มีตัวแก้ไขการเข้าถึงที่ระบุ
  • isGetterVisibility() - การใช้งานแยกต่างหากสำหรับ getters บูลีน
สิ่งสำคัญคือต้องเข้าใจว่าวิธีการทำงานไม่ต่อเนื่องกัน เหล่านั้น. หากฟิลด์ตรงกับพารามิเตอร์ที่ระบุในคำอธิบายประกอบอย่างน้อยหนึ่งรายการ ฟิลด์นั้นจะรวมอยู่ใน JSON พยายามตอบว่าโค้ดนี้จะแสดงผลอะไรหากเราสร้างอินสแตนซ์โดยใช้ตัวสร้างแบบไม่มีพารามิเตอร์:
@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 เป็นต้น ขอบคุณ :)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION