高碑店網(wǎng)站建設(shè)價(jià)格百度互聯(lián)網(wǎng)營(yíng)銷是什么
嗨,親愛的同學(xué)們!歡迎來(lái)到這篇關(guān)于 Jackson JSON 解析器中 Java 對(duì)象轉(zhuǎn) JSON 注解的詳細(xì)解析指南。JSON(JavaScript Object Notation)是一種常用于數(shù)據(jù)交換的輕量級(jí)數(shù)據(jù)格式,而 Jackson 作為一款優(yōu)秀的 JSON 解析庫(kù),通過(guò)注解提供了便捷而強(qiáng)大的方式,讓我們能夠更自由地掌控 Java 對(duì)象與 JSON 之間的轉(zhuǎn)換。在這篇博客中,我將帶你一探 Jackson 注解的奇妙世界,通過(guò)示例代碼揭秘 Java 對(duì)象轉(zhuǎn) JSON 注解的魔法!
什么是 Jackson 注解?
在開始之前,讓我們先簡(jiǎn)要了解一下 Jackson 注解是什么。
Jackson 注解是一組用于配置 Java 對(duì)象序列化和反序列化過(guò)程的注解。通過(guò)在 Java 類或字段上添加這些注解,我們可以指導(dǎo) Jackson 如何處理 JSON 轉(zhuǎn)換。這為我們提供了極大的靈活性,讓我們能夠通過(guò)注解方式定制化 JSON 轉(zhuǎn)換過(guò)程,滿足不同的需求。
基本注解:@JsonProperty
首先,讓我們介紹最基本的注解之一:@JsonProperty
。這個(gè)注解用于指定 JSON 字符串中的字段名與 Java 對(duì)象中的字段名之間的映射關(guān)系。
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonPropertyExample {public static void main(String[] args) throws Exception {// 創(chuàng)建一個(gè) ObjectMapper 對(duì)象ObjectMapper objectMapper = new ObjectMapper();// 創(chuàng)建一個(gè)包含 @JsonProperty 注解的對(duì)象JsonPropertyObject jsonPropertyObject = new JsonPropertyObject("Alice", 25);// 將對(duì)象序列化為 JSON 字符串String jsonString = objectMapper.writeValueAsString(jsonPropertyObject);// 輸出結(jié)果System.out.println(jsonString);}
}
在這個(gè)例子中,JsonPropertyObject
類的字段 name
被注解為 @JsonProperty("fullName")
,這意味著在序列化為 JSON 字符串時(shí),字段 name
將以 "fullName"
作為鍵。輸出結(jié)果應(yīng)該是類似于 {"fullName":"Alice","age":25}
的字符串。
定制化日期格式:@JsonFormat
在處理日期類型時(shí),我們常常需要定制化日期的格式。這時(shí),@JsonFormat
就派上用場(chǎng)了。
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.Date;public class JsonFormatExample {public static void main(String[] args) throws Exception {// 創(chuàng)建一個(gè) ObjectMapper 對(duì)象ObjectMapper objectMapper = new ObjectMapper();// 創(chuàng)建包含 @JsonFormat 注解的對(duì)象JsonFormatObject jsonFormatObject = new JsonFormatObject(new Date());// 將對(duì)象序列化為 JSON 字符串String jsonString = objectMapper.writeValueAsString(jsonFormatObject);// 輸出結(jié)果System.out.println(jsonString);}
}
在這個(gè)例子中,JsonFormatObject
類的字段 birthDate
被注解為 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
,這表示在序列化為 JSON 字符串時(shí),birthDate
將以指定的日期格式呈現(xiàn)。輸出結(jié)果應(yīng)該是類似于 {"birthDate":"2023-01-01"}
的字符串。
忽略字段:@JsonIgnore
有時(shí)候,我們希望在序列化或反序列化過(guò)程中忽略某些字段,這時(shí)可以使用 @JsonIgnore
注解。
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonIgnoreExample {public static void main(String[] args) throws Exception {// 創(chuàng)建一個(gè) ObjectMapper 對(duì)象ObjectMapper objectMapper = new ObjectMapper();// 創(chuàng)建包含 @JsonIgnore 注解的對(duì)象IgnoreFieldObject ignoreFieldObject = new IgnoreFieldObject("Sensitive Data", "Normal Data");// 將對(duì)象序列化為 JSON 字符串String jsonString = objectMapper.writeValueAsString(ignoreFieldObject);// 輸出結(jié)果System.out.println(jsonString);}
}
在這個(gè)例子中,IgnoreFieldObject
類的字段 sensitiveData
被注解為 @JsonIgnore
,這表示在序列化為 JSON 字符串時(shí),sensitiveData
字段將被忽略。輸出結(jié)果應(yīng)該是類似于 {"normalData":"Normal Data"}
的字符串。
支持枚舉:@JsonEnumDefaultValue
在處理枚舉類型時(shí),我們可能會(huì)遇到枚舉值新增但尚未在代碼中處理的情況。這時(shí),@JsonEnumDefaultValue
注解可以幫助我們處理未知的枚舉值。
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonEnumDefaultValueExample {public static void main(String[] args) throws Exception {// 創(chuàng)建一個(gè) ObjectMapper 對(duì)象ObjectMapper objectMapper = new ObjectMapper();// 創(chuàng)建包含 @JsonEnumDefaultValue 注解的對(duì)象EnumDefaultValueObject enumDefaultValueObject = new EnumDefaultValueObject(EnumWithDefault.UNKNOWN);// 將對(duì)象序列化為 JSON 字符串String jsonString = objectMapper.writeValueAsString(enumDefaultValueObject);// 輸出結(jié)果System.out.println(jsonString);}
}
在這個(gè)例子中,EnumDefaultValueObject
類的字段 enumValue
被注解為 @JsonEnumDefaultValue
,并且指定了默認(rèn)值為 EnumWithDefault.UNKNOWN
。這意味著在序列化為 JSON 字符串時(shí),如果枚舉值未知,將使用默認(rèn)值 UNKNOWN
。
定制化序列化與反序列化:@JsonSerialize
與 @JsonDeserialize
有時(shí)候,我們可能需要對(duì)字段進(jìn)行更復(fù)雜的序列化或反序列化操作,這時(shí)可以使用 @JsonSerialize
和 @JsonDeserialize
注解。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;public class JsonSerializeDeserializeExample {public static void main(String[] args) throws Exception {// 創(chuàng)建一個(gè) ObjectMapper 對(duì)象ObjectMapper objectMapper = new ObjectMapper();// 創(chuàng)建包含 @JsonSerialize 和 @JsonDeserialize 注解的對(duì)象SerializeDeserializeObject serializeDeserializeObject = new SerializeDeserializeObject("customValue");// 將對(duì)象序列化為 JSON 字符串String jsonString = objectMapper.writeValueAsString(serializeDeserializeObject);// 輸出結(jié)果System.out.println(jsonString);// 將 JSON 字符串反序列化為對(duì)象SerializeDeserializeObject deserializedObject = objectMapper.readValue(jsonString, SerializeDeserializeObject.class);// 輸出反序列化結(jié)果System.out.println(deserializedObject.getCustomValue());}
}
在這個(gè)例子中,SerializeDeserializeObject
類的字段 customValue
被注解為 @JsonSerialize(using = CustomSerializer.class)
和 @JsonDeserialize(using = CustomDeserializer.class)
。這意味著在序列化時(shí)將使用自定義的序列化器 CustomSerializer
,而在反序列化時(shí)將使用自定義的反序列化器 CustomDeserializer
。
嵌套對(duì)象處理:@JsonManagedReference
與 @JsonBackReference
當(dāng)對(duì)象之間存在雙向關(guān)系時(shí),為了防止無(wú)限遞歸的序列化問(wèn)題,我們可以使用 @JsonManagedReference
和 @JsonBackReference
注解。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonBackReference;
import com.fasterxml.jackson.databind.annotation.JsonManagedReference;public class JsonReferenceExample {public static void main(String[] args) throws Exception {// 創(chuàng)建一個(gè) ObjectMapper 對(duì)象ObjectMapper objectMapper = new ObjectMapper();// 創(chuàng)建包含 @JsonManagedReference 和 @JsonBackReference 注解的對(duì)象ReferenceParent parent = new ReferenceParent("Parent");ReferenceChild child = new ReferenceChild("Child", parent);// 設(shè)置對(duì)象間的關(guān)系parent.setChild(child);// 將對(duì)象序列化為 JSON 字符串String jsonString = objectMapper.writeValueAsString(parent);// 輸出結(jié)果System.out.println(jsonString);}
}
在這個(gè)例子中,ReferenceParent
類的字段 child
被注解為 @JsonManagedReference
,而 ReferenceChild
類的字段 parent
被注解為 @JsonBackReference
。這樣,序列化時(shí)將優(yōu)先處理 @JsonManagedReference
,而忽略 @JsonBackReference
,從而避免了無(wú)限遞歸的問(wèn)題。
小結(jié)
通過(guò)本文的介紹,我們深入探討了 Jackson JSON 解析器中 Java 對(duì)象轉(zhuǎn) JSON 注解的強(qiáng)大功能。從基本的 @JsonProperty
到復(fù)雜的 @JsonSerialize
與 @JsonDeserialize
,再到處理對(duì)象間關(guān)系的 @JsonManagedReference
與 @JsonBackReference
,Jackson 提供了豐富的注解來(lái)滿足各種需求。希望本文能夠幫助你更好地理解和使用 Jackson 注解,讓 JSON 轉(zhuǎn)換變得更加得心應(yīng)手!
作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |