设置Springboot返回jackson数据序列化

简介: 设置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);
    }*/
}

 

目录
相关文章
|
10天前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
26 1
|
7天前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
10天前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
32 2
|
2月前
|
存储 C# 数据库
解决C#对Firebase数据序列化失败的难题
在游戏开发中,Unity结合Firebase实时数据库为开发者提供强大支持,但在C#中进行数据序列化和反序列化时常遇难题。文章剖析了数据丢失或反序列化失败的原因,并给出解决方案,包括使用`JsonUtility`、确保字段标记为`[Serializable]`以及正确配置网络请求。示例代码演示了如何在Unity环境中实现Firebase数据的序列化和反序列化,并通过设置代理IP、Cookies和User-Agent来增强网络请求的安全性。这些技巧有助于确保数据完整传输,提升开发效率。
解决C#对Firebase数据序列化失败的难题
|
2月前
|
存储 分布式计算 Java
|
2月前
|
Java Spring 开发者
解锁 Spring Boot 自动化配置的黑科技:带你走进一键配置的高效开发新时代,再也不怕繁琐设置!
【8月更文挑战第31天】Spring Boot 的自动化配置机制极大简化了开发流程,使开发者能专注业务逻辑。通过 `@SpringBootApplication` 注解组合,特别是 `@EnableAutoConfiguration`,Spring Boot 可自动激活所需配置。例如,添加 JPA 依赖后,只需在 `application.properties` 配置数据库信息,即可自动完成 JPA 和数据源设置。这一机制基于多种条件注解(如 `@ConditionalOnClass`)实现智能配置。深入理解该机制有助于提升开发效率并更好地解决问题。
49 0
|
2月前
|
JSON 缓存 安全
Python pickle 二进制序列化和反序列化 - 数据持久化
Python pickle 二进制序列化和反序列化 - 数据持久化
43 0
|
10天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
32 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
10天前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
52 1
|
7天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
23 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
下一篇
无影云桌面