欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何自定義Jackson序列化?@JsonSerialize

 更新時(shí)間:2021年12月31日 08:50:01   作者:一笑而過(guò)者也  
這篇文章主要介紹了如何自定義Jackson序列化?@JsonSerialize,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

自定義Jackson序列化 @JsonSerialize

自定義json序列化需要實(shí)現(xiàn)StdSerializer<T>或者JsonSerializer<T>。

我要序列化House這個(gè)類(lèi),加上注解,指定用于序列化的類(lèi)

package com.xhx.json.entity; 
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.xhx.json.serializers.HourseSerializer; 
import java.util.Date;
 
@JsonSerialize(using = HourseSerializer.class)
public class Hourse {
    private String location;
    private Date buildDate; 
    public String getLocation() {
        return location;
    }
 
    public void setLocation(String location) {
        this.location = location;
    }
 
    public Date getBuildDate() {
        return buildDate;
    }
 
    public void setBuildDate(Date buildDate) {
        this.buildDate = buildDate;
    }
}
package com.xhx.json.serializers; 
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.xhx.json.entity.Hourse; 
import java.io.IOException;
 
public class HourseSerializer extends StdSerializer<Hourse> { 
    public HourseSerializer(){
        super(Hourse.class);
    }
 
    protected HourseSerializer(Class<Hourse> t) {
        super(t);
    }
 
    @Override
    public void serialize(Hourse hourse, JsonGenerator generator, SerializerProvider provider) throws IOException {
        generator.writeStartObject();
        generator.writeFieldName("id");
        generator.writeString("自定義");
        generator.writeFieldName("location");
        generator.writeString(hourse.getLocation());
        generator.writeObjectField("buildDate",hourse.getBuildDate());
        generator.writeEndObject();
    }
}

測(cè)試:

jackson自定義全局序列化、反序列化

需要自定義Jackson序列化和反序列化有兩種方式,一種是全局定義,一種是非全局定義。先來(lái)看看全局定義。全局定義的步驟如下,以定義一個(gè)localDateTime的序列化和反序列化為例:

創(chuàng)建序列化類(lèi)

創(chuàng)建一個(gè)序列化類(lèi)然后繼承JsonSerializer,重寫(xiě)serialize序列化方法。其中第一個(gè)參數(shù)localDateTime為JsonSerializer的泛型,表示的是被序列化的類(lèi)型的值,第二個(gè)參數(shù)jsonGenerator表示的是用于輸出生成的Json內(nèi)容,第三個(gè)參數(shù)暫時(shí)沒(méi)明白什么應(yīng)用場(chǎng)景。重寫(xiě)方法一般是將想要序列化的字符串傳入 jsonGenerator.writeString。

public final class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
    public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer(); 
    public LocalDateTimeSerializer() {
    }
    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        jsonGenerator.writeString(DateUtil.format(localDateTime, DateUtil.DateTimeFormatEnum.DATE_TIME_FORMAT_4));
    }
}

創(chuàng)建反序列化類(lèi)

創(chuàng)建兩個(gè)類(lèi),一個(gè)類(lèi)繼承JsonDeserializer,一個(gè)類(lèi)繼承KeyDeserializer,重寫(xiě)deserialize反序列化方法。參數(shù)jsonParser用于讀取json內(nèi)容的解析,deserializationContext可用于訪問(wèn)此有關(guān)反序列化的上下文(暫時(shí)也不知道怎么用),返回值則是JsonDeserializer的泛型對(duì)象,表示要反序列化的對(duì)象。一般用法是通過(guò)jsonParser.getText().trim()獲取該字段json字符串,然后將該字符串轉(zhuǎn)換為對(duì)象返回。

public final class LocalTimeDeserializer extends JsonDeserializer<LocalTime> {
    public static final LocalTimeDeserializer INSTANCE = new LocalTimeDeserializer(); 
    public LocalTimeDeserializer() {
    }
    @Override
    public LocalTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        String text = jsonParser.getText().trim();
        return LocalTime.parse(text, DateUtil.DATE_TIME_FORMATTER_6);
    }
}
public final class LocalDateTimeKeyDeserializer extends KeyDeserializer {
    public static final LocalDateTimeKeyDeserializer INSTANCE = new LocalDateTimeKeyDeserializer(); 
    public LocalDateTimeKeyDeserializer() {
    }
    @Override
    public Object deserializeKey(String s, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return StringUtils.isBlank(s) ? null : LocalDateTime.parse(s, DateUtil.DATE_TIME_FORMATTER_4);
    }
}

將兩個(gè)類(lèi)注冊(cè)進(jìn)入jackson核心對(duì)象objectMapper

@Bean
public ObjectMapper objectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //不注釋,會(huì)導(dǎo)致swagger報(bào)錯(cuò)
        //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        //關(guān)閉日期序列化為時(shí)間戳的功能
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        //關(guān)閉序列化的時(shí)候沒(méi)有為屬性找到getter方法,報(bào)錯(cuò)
        objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        //關(guān)閉反序列化的時(shí)候,沒(méi)有找到屬性的setter報(bào)錯(cuò)
        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        //序列化的時(shí)候序列對(duì)象的所有屬性
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        //反序列化的時(shí)候如果多了其他屬性,不拋出異常
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        //如果是空對(duì)象的時(shí)候,不拋異常
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        SimpleModule simpleModule = new SimpleModule();
        //json值序列化
        simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
        //json值反序列化
        simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
        //json鍵序列化
        simpleModule.addKeySerializer(LocalDateTime.class,LocalDateTimeSerializer.INSTANCE);
        //json鍵反序列化
        simpleModule.addKeyDeserializer(LocalDateTime.class, LocalDateTimeKeyDeserializer.INSTANCE);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }

小結(jié)一下

以上,通過(guò)objectMapper的配置,完成了全局序列化、反序列化的配置,如果不需要全局則通過(guò)@jsonserialize或 @JsonDeserialize指定使用的序列化、反序列化類(lèi)。僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家

相關(guān)文章

最新評(píng)論