設置Springboot返回jackson數據序列化


LocalDateTime格式化
使用下面的配置相當於全局配置就不需要給字段添加@JsonFormat(pattern = DateUt.YYYY_MM_DD_HH_MM_SS)
如果個別字段需要不同的配置可使用@JsonFormat(pattern = DateUt.YYYY_MM_DD),@JsonFormat會優先使用,反序列化亦可使用@JsonFormat注解
 

package com.example.mpdemo.config;

import com.example.mpdemo.common.IBaseEnum;
import com.example.mpdemo.util.DateUt;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.jackson.JsonComponentModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * @from: fhadmin.cn
 * @Date: 2021/8/19
 * @Description: 時間統一格式化
 */
@Configuration
public class JSONFormatConfig {

    private static final DateTimeFormatter ymdhms = DateTimeFormatter.ofPattern(DateUt.YYYY_MM_DD_HH_MM_SS);

    private static final DateTimeFormatter ymd = DateTimeFormatter.ofPattern(DateUt.YYYY_MM_DD);

    private static final DateTimeFormatter hms = DateTimeFormatter.ofPattern(DateUt.HH_MM_SS);

    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        //序列化設置時間格式
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(ymdhms));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(ymd));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(hms));
        //反序列化設置時間格式
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(ymdhms));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(ymd));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(hms));

        objectMapper.registerModule(javaTimeModule);
        //序列化枚舉值為數據庫存儲值 缺少后打印枚舉不能轉成對應值,需自定義toString方法/或者使用@JsonValue注解
        //objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
        //設置序列化枚舉格式
        JsonComponentModule jsonComponentModule = new JsonComponentModule();
        jsonComponentModule.addSerializer(IBaseEnum.class,new BaseEnumSerializer());
        objectMapper.registerModule(jsonComponentModule);
        return objectMapper;
    }
}

 

Date格式化

#Date類型生效 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 

枚舉格式化

把下面的類注冊在objectMapper中

//設置序列化枚舉格式 JsonComponentModule jsonComponentModule = new JsonComponentModule(); jsonComponentModule.addSerializer(IBaseEnum.class,new BaseEnumSerializer()); objectMapper.registerModule(jsonComponentModule); 

根據業務需求調整需要格式化的結構

package com.example.mpdemo.config;

import com.example.mpdemo.common.IBaseEnum;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

/**
 * @from: fhadmin.cn
 * @Date: 2021/8/19
 * @Description: 組織類型枚舉序列化
 */

//可以使用JsonSerializer
public class BaseEnumSerializer extends JsonSerializer<IBaseEnum> {
//public class BaseEnumSerializer extends StdSerializer<IBaseEnum> {

    //protected BaseEnumSerializer(){
    //    super(IBaseEnum.class);
    //}

    @Override
    public void serialize(IBaseEnum value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        //返回枚舉對象值字符串
        //gen.writeString(value.getValue().toString());
        //返回枚舉對象值
        gen.writeObject(value.getValue());
        //enum2Object(value, gen);
    }

    /**
     * 把枚舉轉成對象
     */
    private void enum2Object(IBaseEnum value, JsonGenerator gen) throws IOException {
        gen.writeStartObject();
        gen.writeFieldName(IBaseEnum.ID);
        gen.writeObject(value.getValue());
        gen.writeFieldName(IBaseEnum.NAME);
        gen.writeString(value.getName());
        gen.writeEndObject();
    }
}

 

使用注解方式序列化枚舉

使用@JsonValue注解加在需要序列化的字段上,可省略注冊配置,只能顯示對應的值,不可擴展,如需要擴展使用@JsonSerialize(using = BaseEnumSerializer.class)注解

package com.example.mpdemo.enums;

import com.example.mpdemo.common.IBaseEnum;
import com.example.mpdemo.config.BaseEnumSerializer;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

/**
 * @from: fhadmin.cn
 * @Date: 2021/8/17
 * @Description: 是否刪除
 */
//不使用全局配置可使用該注解
//@JsonSerialize(using = BaseEnumSerializer.class)
public enum DeleteEnum implements IBaseEnum<Boolean> {

    DELETE_YES(true,"已刪除"),
    DELETE_NO(false,"未刪除");

    //使用JsonValue注解可格式化顯示值
    @JsonValue
    private final boolean id;
    private final String name;

    DeleteEnum(boolean id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public Boolean getValue() {
        return this.id;
    }

    @Override
    public String getName() {
        return this.name;
    }

    //使用JsonValue注解可注釋掉toString
    /*@Override
    public String toString() {
        //根據情況給前台數據展示deleted或descp
        return String.valueOf(this.deleted);
    }*/
}
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM