设置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);

    }*/

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容