在一個寒冷的春夜,我終於達到了33級。摩挲著我的程式設計師雙手,我已經準備好擁抱 JSON 序列化和反序列化的整個領域了,但不幸的是,我什麼都不懂。我不記得講座的內容,但問題憑直覺就解決了。在這方面,我決定深入研究 Jackson 框架並弄清楚這個 JSON 是什麼。
我將嘗試以備忘單的形式以實用且簡潔的方式展示我的所有知識(無論是為我自己還是為讀者)。 傑克森註釋之旅。 我們在 JSON 過程中遇到的第一件事就是 @JsonAutoDetect 註解。乍一看,這是一個簡單的總結,但作者卻花了最長的時間才弄清楚。摘要中有我們需要的 5 個方法:
- fieldVisibility () - 僅序列化具有指定存取修飾符的字段
- getterVisibility()/setterVisibility() - 序列化其 getter/setter 具有指定存取修飾符的字段
- isGetterVisibility() - 布爾 getter 的單獨實現
@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 等註釋。謝謝 :)
GO TO FULL VERSION