JavaRush /Java Blog /Random-TW /Jackson框架簡介
Mikhail Fufaev
等級 35
Москва

Jackson框架簡介

在 Random-TW 群組發布
在一個寒冷的春夜,我終於達到了33級。摩挲著我的程式設計師雙手,我已經準備好擁抱 JSON 序列化和反序列化的整個領域了,但不幸的是,我什麼都不懂。我不記得講座的內容,但問題憑直覺就解決了。在這方面,我決定深入研究 Jackson 框架並弄清楚這個 JSON 是什麼。
傑克遜框架
我將嘗試以備忘單的形式以實用且簡潔的方式展示我的所有知識(無論是為我自己還是為讀者)。 傑克森註釋之旅。 我們在 JSON 過程中遇到的第一件事就是 @JsonAutoDetect 註解。乍一看,這是一個簡單的總結,但作者卻花了最長的時間才弄清楚。摘要中有我們需要的 5 個方法:
  • fieldVisibility () - 僅序列化具有指定存取修飾符的字段
  • getterVisibility()/setterVisibility() - 序列化其 getter/setter 具有指定存取修飾符的字段
  • isGetterVisibility() - 布爾 getter 的單獨實現
重要的是要理解這些方法是分離工作的。那些。如果該欄位至少與註解中指定的參數之一匹配,則它將包含在 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 物件包含兩個參數:name、id。猜猜它將呼叫哪個建構函數。是的,如果我們編譯這段程式碼,它會拋出一個錯誤,為什麼呢?因為我們限制了建構子的可見性(只有有 protected、public 修飾詞的建構子才可見)。如果您刪除 CreatorVisibility 它將起作用。問題出現了。建構函式中的@JsonProperty是什麼?我想我會在文章的下一部分討論這個問題。 PS先生們,我真的很想至少得到一些關於這篇文章的回應。我想知道這個主題是否有需求,是否值得繼續下去,因為話題很多,而且都很有趣。我還想考慮 @JsonView、@JsonManagedReference、@JsonBackReference、@JsonUnwrapped 等註釋。謝謝 :)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION