SpringBoot日期参数设置和Json序列化日期设置

目录

1、@DateTimeFormat(pattern = "yyyy-MM-dd")

2、全局的DateFormat设置

3、@JsonFormat(pattern = "yyyy-MM-dd")

4、全局Json序列化日期设置

【1】application.properties形式

【2】配置文件格式


前端时间组件,一般情况下直接会传一个yyyy-MM-dd的日期格式字符串到后台。

这个时候如果我们直接用java.util.Date类型就无法正确接收到。或者我们从数据库里查到DateTime类型并且用java的Date类型接收并返回给前台的时候,前台也无法用yyyy-MM-dd的形式进行呈现。
这个时候,前面两种情况分别对应了@DateTimeFormat(前端传入参数格式设置)和@JsonFormat(json序列化格式设置)注解的使用。
 

User类

package org.springframework.myspringboot.entity;

import com.fasterxml.jackson.annotation.JsonFormat;


import java.util.Date;

/**
 * @author winnie
 * @PackageName:org.springframework.myspringboot.entity
 * @Description TODO
 * @date 2022/7/30 17:16
 */
public class User {
	private String username;
	private int age;
	private Date birthday;

	@Override
	public String toString() {
		return "User{" +
				"username='" + username + '\'' +
				", age=" + age +
				", birthday=" + birthday +
				'}';
	}

	public User() {
		System.out.println("user的无参构造函数执行了");
	}

	public User(String username, int age, Date birthday) {
		this.username = username;
		this.age = age;
		this.birthday = birthday;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

这里我们传入的日期格式必须是这种2000/01/01,这种,如果是2000-01-01就会报错

那么假设我们想要传入的日期格式是这种2000-01-01格式,该怎么做?

1、@DateTimeFormat(pattern = "yyyy-MM-dd")

 

2、全局的DateFormat设置

可以在application.properties中设置

使用注解@DateTimeFormat(pattern = "yyyy-MM-dd")确实可以定制我们传入的日期类型是什么,但是我们发现一个问题,就是返回的json数据中的日期还是国际的日期格式,那么就引出了第二个注解@JsonFormat(pattern = "yyyy-MM-dd")

3、@JsonFormat(pattern = "yyyy-MM-dd")

JSON序列化的时候我们的日期确实已经被序列化成我们需要的格式

但是如果单纯使用这个注解,就会发现我们的传入的参数格式就必须是 / 类型,所以一般情况下,我们可以将两个注解一起结合使用

4、全局Json序列化日期设置

如果我们很多类中都有日期需要进行json序列化,那么我们一个个进行@JsonFormat会很麻烦,所以我们可以利用全局的json格式化来使用,这里要注意:我们在单个类中的@JsonFormat的优先级是比我们全局的高

【1】application.properties形式

【2】配置文件格式

在HttpMessageConvertersAutoConfiguration的自动配置类中,引入了我们的jackjson,Jsonb,Gson的序列化类

 默认的json序列化的类是Jackson

第一种方式:

这里看到我们只要引入自己的json转换器MappingJackson2HttpMessageConverter,就可以替换原来的json的序列化规则

package org.springframework.myspringboot.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

/**
 * @author winnie
 * @PackageName:org.springframework.myspringboot.config
 * @Description TODO
 * @date 2022/8/4 10:32
 */
@Configuration
public class WebMvcConfig {

	//自定义json消息转换器
	@Bean
	MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
		MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(objectMapper);
		objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
		return converter;
	}

}

我们需要怎么进行json'的序列化,我们就可以直接在里面进行设置

我们依旧要跟@DateTimeFormat配合使用

第二种方式:

我们这里看到,我们进行序列化设置的时候是跟ObjectMapper有关,springboot中是注入了自己的ObjectMapper

那么我们可以注入自己的Objectmapper来代替springboot的,也可以达到一样的效果

Spring Boot提供了自定义JSON序列化和反序列化的方式,可以通过实现`JsonSerializer`和`JsonDeserializer`接口来实现。 自定义JSON序列化: 1. 创建一个类,实现`JsonSerializer`接口,并重写`serialize`方法。在该方法中,可以自定义对象的序列化逻辑,将对象转换为JSON格式的字符串。 2. 在需要进行自定义序列化的字段上,使用`@JsonSerialize(using = YourSerializer.class)`注解,将自定义的序列化类指定为该字段的序列化器。 自定义JSON序列化: 1. 创建一个类,实现`JsonDeserializer`接口,并重写`deserialize`方法。在该方法中,可以自定义JSON字符串的反序列化逻辑,将JSON字符串转换为对象。 2. 在需要进行自定义反序列化的字段上,使用`@JsonDeserialize(using = YourDeserializer.class)`注解,将自定义的反序列化类指定为该字段的反序列化器。 示例代码如下: ```java // 自定义序列化器 public class CustomSerializer extends JsonSerializer<YourClass> { @Override public void serialize(YourClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 自定义序列化逻辑 gen.writeString(value.toString()); } } // 自定义反序列化器 public class CustomDeserializer extends JsonDeserializer<YourClass> { @Override public YourClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 自定义反序列化逻辑 String value = p.getValueAsString(); return new YourClass(value); } } // 在需要进行自定义序列化和反序列化的字段上使用注解 public class YourClass { @JsonSerialize(using = CustomSerializer.class) private String field1; @JsonDeserialize(using = CustomDeserializer.class) private String field2; // 省略其他代码 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值