1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Jackson 常用注解

        共 12804字,需瀏覽 26分鐘

         ·

        2022-05-24 16:11


        @JacksonInject

        通過 @JacksonInject 注解可以在 Jackson 反序列化的時候為空值字段動態(tài)賦值,當反序列化的對應(yīng)屬性值不存在時,可通過該注解為其動態(tài)設(shè)置值。

        @Getter@Setterpublic class User {
        ????@JacksonInject(value?=?"dynamic")????private?String?name;?????private?Integer?age;}

        對其進行反序列化:

        public?class?JacksonInjectTest?{
        ????private?static?final?ObjectMapper?MAPPER?=?new?ObjectMapper();?????public?static?void?main(String[]?args)?throws?JsonProcessingException?{????????//?名稱和注解中聲明的相同才行?????????InjectableValues.Std?injectableValues?=?new?InjectableValues.Std()?????????????????.addValue("dynamic",?"some?dynamic?value");?????????MAPPER.setInjectableValues(injectableValues);?????????//?反序列化空對象?????????User?u?=?MAPPER.readValue("{}",?User.class);?????????System.out.println(u.getName()); }?}// 輸出結(jié)果:some dynamic value


        @JsonAlias

        通過 @JsonAlias 注解可以為對象屬性定義一個或多個別名,然后在反序列化時根據(jù)別名進行屬性映射。但要注意,別名不能與其他屬性名沖突,否則反序列化時會拋異常。

        @Getter@Setterpublic class User {?@JsonAlias(value = "nm")private String name;?private Integer age;?}

        對其進行反序列化:

        public static void main(String[] args) throws JsonProcessingException {    User u = MAPPER.readValue("{\"nm\":\"張三\"}", User.class);    System.out.println(u.getName());}// 輸出結(jié)果:張三


        @JsonAnyGetter、@JsonAnySetter

        @JsonAnyGetter 注解可用于將一組鍵值對平鋪展開到常規(guī)屬性中,比如某個對象正常序列化的結(jié)果為:

        {??"name":?"張三",???"info":?{????"address":?"china",????"age":?"25"??}?}

        通過該注解修飾后,序列化后的結(jié)果為:

        {??"name":?"張三",??"address":?"china",???"age":?"25"}

        不過這個注解的使用也是有條件限制的:

        • 被修飾的方法不能是靜態(tài)方法

        • 被修飾的方法必須是無參方法

        • 被修飾的方法返回值必須是 Map 類型

        • 同一實體中只能有一個方法使用該注解

        具體如下例所示:

        @Getter@Setterpublic?class?User?{?????private?String?name;?    private Map<String, String> info;?    @JsonAnyGetter    public Map<String, String> getInfo() {        return info;    }}

        對該對象進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????Map?info?=?new?HashMap<>();????info.put("age",?"25");?????info.put("address",?"china");?????User?user?=?new?User();?????user.setName("張三");????user.setInfo(info);?????System.out.println(MAPPER.writeValueAsString(user));?}// 輸出結(jié)果:{"name":"張三","address":"china","age":"25"}


        @JsonAnySetter

        ?注解的功能與 @JsonAnyGetter 正好相反,使用示例如下:

        @Getter@Setterpublic class User {?     private String name;
        ???????? private?String?address;? private String age;?????@JsonAnySetter?????public?void?setInfo(Map<String,?String>?info)?{????????this.address?=?info.get("address");?????????this.age?=?info.get("age"); }?}

        對其進行反序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?MAPPER.readValue("{\"name\":\"張三\",\"info\":{\"address\":\"china\",\"age\":\"25\"}}",?User.class);?????System.out.println(user.getAddress());}?// 輸出結(jié)果:china


        @JsonAutoDetect

        @JsonAutoDetect 注解可以用于強制序列化私有屬性,即使沒有提供 Getter 方法:

        @Setter@JsonAutoDetect(fieldVisibility?=?JsonAutoDetect.Visibility.ANY)public?class?User?{
        private String name;
        private String age;?}

        我們沒有為 User 提供 Getter 方法,對其進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.setName("張三");????user.setAge("25");    System.out.println(MAPPER.writeValueAsString(user));?}// 輸出結(jié)果:{"name":"張三","age":"25"}


        @JsonBackReference、@JsonManagedReference

        @JsonManagedReference 注解和 @JsonBackReference 注解用于處理父子關(guān)系并解決對象間的循環(huán)引用,比如兩個類互相持有對方的場景:

        @Getter@Setterpublic?class?User?{?    private String name;    
        ????@JsonManagedReference private Friend friend;?}?@Getter@Setterpublic class Friend {
        private String number;?????@JsonBackReference private User user;?}

        對其進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.setName("張三");????Friend?friend?=?new?Friend();????friend.setNumber("001");????friend.setUser(user);????user.setFriend(friend);????System.out.println(MAPPER.writeValueAsString(user));}// 輸出結(jié)果:{"name":"張三","friend":{"number":"001"}}


        @JsonCreator

        Jackson 在反序列化時默認會通過對象的無參構(gòu)造方法創(chuàng)建對象,如果想要通過自定義的構(gòu)造方法創(chuàng)建對象,需要通過 @JsonCreator 來指定構(gòu)造方法,并通過 @JsonProperty 設(shè)置構(gòu)造方法中參數(shù)對應(yīng)的 JSON 屬性名:

        @Getterpublic class User {?private final String name;
        ????private?final?String?age;?????@JsonCreator????public?User(@JsonProperty("name")?String?name,?@JsonProperty("age")?String?age)????????this.name?=?name;????????this.age?=?age;?????}}

        反序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?MAPPER.readValue("{\"name\":\"張三\",\"age\":\"25\"}",?User.class);????System.out.println(user.getName());}?// 輸出結(jié)果:張三


        @JsonEnumDefaultValue

        反序列化時,如果對應(yīng)的枚舉值不存在 Jackson 默認會拋出異常。我們可以通過 @JsonEnumDefaultValue 注解為未知的枚舉類型賦一個默認值來兜底,但要記得在 ObjectMapper 中手動開啟該功能。

        @Setter@Getterpublic?static?class?User?{????private?String?name;????private?Sex?sex;}?private?enum?Sex?{????MAN,????WOMAN,????@JsonEnumDefaultValue????UNKNOWN}

        反序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????MAPPER.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);????User?user?=?MAPPER.readValue("{\"name\":\"張三\",\"sex\":\"NONE\"}",?User.class);????System.out.println(user.getSex());}// 輸出結(jié)果:UNKNOWN


        @JsonFormat

        默認序列化會將 Date 類型解析成時間戳,如果是 Java 8 提供的 LocalDateTime 則默認不支持序列化,需要額外注冊 Module 支持,可以通過?@JsonFormat?注解在序列化過程中對數(shù)據(jù)進行格式化輸出:

        格式化時間(只支持 Date 類型):

        @Setter@Getterpublic static class User {?????@JsonFormat(shape?=?JsonFormat.Shape.STRING,?pattern?=?"yyyy-MM-dd?HH:mm:ss",?timezone?=?"GMT+8")    private Date birthday;?}?// 序列化輸出:{"birthday":"2021-09-06 21:13:42"}

        格式化枚舉類型(默認只輸出枚舉名稱,如果有枚舉屬性會忽略):

        ?

        @Getter@JsonFormat(shape?=?JsonFormat.Shape.OBJECT)public?enum?Sex?{????MAN(1,?"男生"),????WOMAN(2,?"女生");?    private final Integer code;?????private?final?String?description;?????Sex(Integer?code,?String?description)?{????????this.code?=?code;????????this.description?=?description;    }?}// 序列化輸出:{"sex":{"code":1,"description":"男生"}}


        @JsonGetter、@JsonSetter

        @JsonGetter、@JsonSetter 注解用于在序列化和反序列化時指定屬性的 Getter 和 Setter 方法。特別針對有些不正規(guī)的方法:

        public class User {?????private?String?name;?    @JsonGetter("name")    public String returnName() {        return name;    }?????@JsonSetter("name")????public?void?putName(String?name)?{????????this.name?=?name;    }?}

        User 類沒有提供標準的 Setter、Getter 方法,對其進行序列化和反序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.putName("張三");????System.out.print(MAPPER.writeValueAsString(user));????User?userD?=?MAPPER.readValue("{\"name\":\"張三\"}",?User.class);????System.out.print(userD.returnName());}// 輸出結(jié)果:{"name":"張三"}張三


        @JsonIdentityInfo

        @JsonIdentityInfo 注解作用于類或?qū)傩陨?,在序列化、反序列化時可以為該對象或字段添加一個對象識別碼,比如 @id 或者 Class 對象名,主要用于解決字段循環(huán)嵌套的問題。

        @Getter@Setterpublic class User {
        private String name;
        ????@JsonIdentityInfo(generator?=?ObjectIdGenerators.UUIDGenerator.class) private User friend;?}

        循環(huán)嵌套后進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?userA?=?new?User();????userA.setName("張三");????User?userB?=?new?User();????userB.setName("李四");????//?循環(huán)引用????userA.setFriend(userB);????userB.setFriend(userA);????System.out.println(MAPPER.writeValueAsString(userA));}//?輸出結(jié)果:{??"name":?"張三",??"friend":?{????"@id":?"5eba3199-ed97-4642-81b8-ad7b61ed9fd8",????"name":?"李四",????"friend":?{??????"@id":?"fddcb9fa-c934-4735-8fec-2923675976cc",??????"name":?"張三",??????"friend":?"5eba3199-ed97-4642-81b8-ad7b61ed9fd8"    }??}}


        @JsonIgnore

        @JsonIgnore 也是常用的一個注解,在序列化、反序列化時會忽略被該注解標記的屬性。

        @Getter@Setterpublic class User {?????@JsonIgnore????private?String?name;?    private String age;?}

        對其進行序列化和反序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.setName("張三");????user.setAge("25");????System.out.print(MAPPER.writeValueAsString(user));????User?userD?=?MAPPER.readValue("{\"name\":\"張三\",\"age\":\"25\"}",?User.class);????System.out.print(userD.getName());}// 輸出結(jié)果:{"age":"25"}null


        @JsonIgnoreProperties

        @JsonIgnoreProperties 注解可以在序列化、反序列化時忽略多個屬性,通常標記在類上。

        @Getter@Setter@JsonIgnoreProperties({"name", "age"})public class User {?     private String name;?     private String age;?     private String sex;?}// 序列化結(jié)果:{"sex":"男"}

        如果有些屬性不太確定也可以通過該注解過濾掉,避免未知屬性異常:

        @JsonIgnoreProperties(ignoreUnknown = true)

        此外,還提供了 allowGetters、allowSetters 屬性用于僅忽略 Setter 或 Getter:

        @JsonIgnoreProperties(allowGetters = true, allowSetters = true)


        @JsonIgnoreType

        @JsonIgnoreType 注解用于在序列化、反序列化時忽略掉某種特定類型,作用在類上,引用這個類的其他對象在序列化、反序列化時會忽略這個類,主要用來對一些數(shù)據(jù)敏感對象進行忽略。

        @Getter@Setterpublic?class?User?{?   private String name;?   private Hobby hobby;
        }?@Getter@Setter@JsonIgnoreTypepublic?class?Hobby?{? private String item;?}

        對其進行序列化、反序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.setName("張三");?????Hobby?hobby?=?new?Hobby();????hobby.setItem("basketball");????user.setHobby(hobby);????System.out.print(MAPPER.writeValueAsString(user));????User?userD?=?MAPPER.readValue("{\"name\":\"張三\",\"hobby\":{\"item\":\"basketball\"}}",?User.class);????System.out.print(userD.getHobby()?==?null);}// 輸出結(jié)果:{"name":"張三"}true


        @JsonInclude

        @JsonInclude 注解用于標識對象屬性何時可以被序列化,可以把該注解標記在屬性字段上,也可以通過 ObjectMapper 的 setSerializationInclusion 方法進行統(tǒng)一設(shè)置。Jackson 默認會把空值字段序列化為 null,我們可以通過 JsonInclude.Include.NON_NULL 來過濾掉空值字段:

        @Getter@Setterpublic class User {?    private String name;?    @JsonInclude(JsonInclude.Include.NON_NULL)    private String age;?}

        對其進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.setName("張三");????System.out.println(MAPPER.writeValueAsString(user));}// 輸出結(jié)果:{"name":"張三"}


        @JsonIncludeProperties

        @JsonIncludeProperties 注解與 @JsonIgnoreProperties 注解正好相反,它只會在序列化、反序列化包含在注解中的屬性,其它屬性都不參與序列化和反序列化。

        @Getter@Setter@JsonIncludeProperties({"name",?"age"})public class User {
        ???? private?String?name;? private String age;
        private String sex;?}

        對其進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????User?user?=?new?User();????user.setName("張三");????user.setAge("25");?????user.setSex("男");?????System.out.println(MAPPER.writeValueAsString(user));}// 輸出結(jié)果:{"name":"張三","age":"25"}


        @JsonProperty

        @JsonProperty 也是常用注解,它包含了很多其他注解的功能,因此最好不要與功能重復(fù)的注解同時使用,以免產(chǎn)生干擾。該注解通常標記在屬性或?qū)傩缘?Getter、Setter 方法上,功能如下:

        可以在反序列化時指定屬性的名稱,類似 @JsonAlias 的效果。

        @Getter@Setterpublic?class?User?{?????@JsonProperty("nm")????private?String?name;?????private?String?age;?}?// 反序列化時可以將nm對應(yīng)的值賦值到name字段上


        通過 Access 枚舉可以控制哪些屬性可以進行序列化、反序列化,類似 @JsonIgnore 的效果。

        @Getter@Setterpublic?class?User?{?????@JsonProperty(access?=?JsonProperty.Access.READ_ONLY)    private String name;
        private String age;?}// 因為name屬性被設(shè)置為只讀,所以反序列化時會忽略name屬性


        @JsonRawValue

        @JsonRawValue 注解會將字符串形式的 JSON 也嘗試序列化為對象,示例如下:

        ?@Getter@Setterpublic class User {
        ????private?String?name;?????@JsonRawValue private String json;?}

        對其進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{?????User?user?=?new?User();?????user.setName("張三");?????user.setJson("{\"age\":\"25\"}");????System.out.println(MAPPER.writeValueAsString(user));}// 輸出結(jié)果:{??"name":?"張三",???"json":?{?????"age":?"25"???}?}//?如果沒有該注解修飾則輸出:{??"name":?"張三",???"json":?"{\"age\":\"25\"}"}


        @JsonUnwrapped

        @JsonUnwrapped 注解可以在序列化時把一個對象中嵌套對象的屬性平鋪展開,放到同一層級:

        @Getter?@Setter?public?static?class?User?{?     private String name;?????@JsonUnwrapped?    private Identity identity;?}?@Getter@Setterpublic?static?class?Identity?{?????private?String?age;?    private String address;?}

        對其進行序列化:

        public static void main(String[] args) throws JsonProcessingException {?    User user = new User();?    user.setName("張三");?    Identity identity = new Identity();?    identity.setAge("25");?    identity.setAddress("china");?    user.setIdentity(identity);?    System.out.println(MAPPER.writeValueAsString(user));?}// 輸出結(jié)果:{"name":"張三","age":"25","address":"china"}


        @JsonFilter

        @JsonFilter 注解用于指定在序列化期間要使用的過濾器:

        @Getter@Setter@JsonFilter("customFilter")public static class User {
        private String name;? private String age;? private String cardCode;
        private String address;?}

        我們對 User 對象進行序列化:

        public?static?void?main(String[]?args)?throws?JsonProcessingException?{????SimpleBeanPropertyFilter?propertyFilter?=?SimpleBeanPropertyFilter.filterOutAllExcept("cardCode",?"address");????FilterProvider?provider?=?new?SimpleFilterProvider().addFilter("customFilter",?propertyFilter);????User?user?=?new?User();????user.setName("張三");????user.setAge("25");?????user.setAddress("china");?????user.setCardCode("123456");?????System.out.println(MAPPER.writer(provider).writeValueAsString(user));}// 輸出結(jié)果:{"cardCode":"123456","address":"china"}


        @JsonAppend

        @JsonAppend 注解可以在序列化時額外添加指定的屬性:

        @Getter@Setter@JsonAppend(attrs?=?{????@JsonAppend.Attr(value?=?"version")????})public?class?User?{
        private String name;? private String age;?}

        我們可以在序列化時手動增加 version=1.0 的屬性值:

        public static void main(String[] args) throws JsonProcessingException {    User user = new User();    user.setName("張三");    user.setAge("25");    String str = MAPPER.writerFor(User.class).withAttribute("version", "1.0").writeValueAsString(user);    System.out.println(str);}// 輸出結(jié)果:{"name":"張三","age":"25","version":"1.0"}


        記得點「」和「在看」↓

        愛你們


        瀏覽 18
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            波多野42部无码喷潮更新时间 | 一级毛片视频免费播放 | 在线观看污污的视频 | 欧美午夜精品久久久久久孕妇 | 亚洲激情中文字幕 | 高潮小视频| 欧美精品黄片 | 91精品国产综合久久香蕉922 | 国产欧美日韩一级片 | 嫩b网站|