JavaRush /Blog Java /Random-VI /Giới thiệu về Khung Jackson
Mikhail Fufaev
Mức độ
Москва

Giới thiệu về Khung Jackson

Xuất bản trong nhóm
Vào một đêm mùa xuân lạnh giá, cuối cùng tôi cũng đạt được cấp độ 33. Xoa tay lập trình viên của mình, tôi đã chuẩn bị sẵn sàng để nắm bắt toàn bộ lĩnh vực tuần tự hóa và giải tuần tự hóa JSON, nhưng thật không may, tôi không hiểu gì cả. Tôi không nhớ nội dung bài giảng, nhưng các vấn đề đã được giải quyết bằng trực giác. Về vấn đề này, tôi quyết định đi sâu vào tìm hiểu sâu hơn về Jackson Framework và tìm hiểu xem JSON này là gì.
Khung Jackson
Tôi sẽ cố gắng trình bày tất cả kiến ​​thức của mình một cách thực tế và ngắn gọn dưới dạng cheat sheet (cho cả bản thân tôi và người đọc). Hành trình tới Jackson Chú thích. Điều đầu tiên chúng ta gặp trên đường tới JSON là chú thích @JsonAutoDetect. Thoạt nhìn, đây là một bản tóm tắt dễ dàng nhưng tác giả phải mất nhiều thời gian nhất mới tìm ra được. Bản tóm tắt có 5 phương thức chúng ta cần:
  • fieldVisibility () - Chỉ tuần tự hóa các trường có công cụ sửa đổi truy cập được chỉ định
  • getterVisibility()/setterVisibility() - tuần tự hóa các trường có getter/setter có công cụ sửa đổi truy cập được chỉ định
  • isGetterVisibility() - triển khai riêng cho các getters boolean
Điều quan trọng là phải hiểu rằng các phương pháp này hoạt động một cách rời rạc. Những thứ kia. nếu trường khớp với ít nhất một trong các tham số được chỉ định trong chú thích thì trường đó sẽ được đưa vào JSON. Hãy thử trả lời xem đoạn mã này sẽ xuất ra cái gì nếu chúng ta tạo một cá thể bằng cách sử dụng hàm tạo không tham số:
@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;
    }
}
Điều gì sẽ xảy ra nếu chúng ta xóa isGetterVisibility? Bốn phương pháp được liệt kê đã định cấu hình quy trình tuần tự hóa. Lần lượt thứ năm quy định quá trình khử lưu huỳnh:
  • CreatorVisibility() là phương pháp khó hiểu nhất. Nó hoạt động với các hàm tạo và với các phương thức xuất xưởng (các phương thức tạo đối tượng khi được gọi). Hãy xem một ví dụ:
@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);
}
Lưu ý quan trọng về cơ chế khử lưu huỳnh! Khi chúng ta cố gắng tạo một đối tượng từ JSON, hàm tạo của lớp được yêu cầu sẽ được tìm kiếm với cùng một bộ tham số như trong đối tượng JSON. Trong ví dụ trên, đối tượng JSON của chúng ta gồm có 2 tham số: name, id. Đoán xem nó sẽ gọi hàm tạo nào. Và vâng, nếu chúng ta biên dịch mã này, nó sẽ báo lỗi, tại sao? Bởi vì chúng tôi đã giới hạn khả năng hiển thị của hàm tạo (chỉ các hàm tạo có công cụ sửa đổi công khai, được bảo vệ mới hiển thị). Nếu bạn loại bỏ CreatorVisibility thì nó sẽ hoạt động. Câu hỏi phát sinh. @JsonProperty trong hàm tạo là gì? Tôi nghĩ tôi sẽ nói về điều này trong phần tiếp theo của bài viết. Tái bút Thưa quý vị, tôi thực sự muốn nhận được ít nhất một số phản hồi về bài viết. Tôi tự hỏi liệu chủ đề này có được yêu cầu hay không và liệu nó có đáng để tiếp tục hay không, bởi vì có rất nhiều chủ đề và tất cả chúng đều rất thú vị. Tôi cũng muốn xem xét các chú thích như @JsonView, @Json ManagedReference, @JsonBackReference, @JsonUnwrapped, v.v. Cảm ơn :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION