- 反序列化:把字节序列恢复为Java对象的过程。(前端请求接口,传入json数据,后端反序列化为java对象的过程)
- 序列化:把Java对象转换为字节序列的过程。(后端序列化java对象转化为字节的过程)
- 序列化和反序列化的常用方式
方式1 @JsonDeserialize @JsonSerialize注解, 方便局部的字段处理。
@PostMapping("/insert")
public UserForm userInsert(@RequestBody UserForm form) {
log.info("form:{}",JSON.toJSONString(form));
return form;
}
- 1.2在需要序列化和反序列化的字段上加上
@JsonDeserialize @JsonSerialize
package com.my.demo.model.form;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.my.demo.serializer.DateDeSerialize;
import com.my.demo.serializer.DateSerialize;
import lombok.Data;
import java.util.Date;
@Data
public class UserForm {
@JsonDeserialize(using = DateDeSerialize.class)
@JsonSerialize(using = DateSerialize.class)
private Date joinDate;
}
- 1.3 自定义序列化和反序列化的类, 分别继承
StdDeserializer StdSerializer
package com.my.demo.serializer;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.my.demo.utils.DateUtil;
import java.io.IOException;
import java.util.Date;
public class DateDeSerialize extends StdDeserializer<Date> {
protected DateDeSerialize(Class<?> vc) {
super(vc);
}
public DateDeSerialize() {
this(null);
}
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String text = p.getText();
return DateUtil.parseDate(text);
}
}
package com.my.demo.serializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.my.demo.utils.DateUtil;
import java.io.IOException;
import java.util.Date;
public class DateSerialize extends StdSerializer<Date> {
protected DateSerialize(Class<Date> t) {
super(t);
}
protected DateSerialize() {
this(null);
}
@Override
public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
String s = DateUtil.formatDate(value, "yyyy-MM-dd");
gen.writeString(s);
}
}
方式2 @Configuration配置全局的序列化和反序列化
package com.my.demo.model.form;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@Data
public class UserForm {
private LocalDateTime joinDateTime;
private LocalDate joinDate;
private LocalTime joinTime;
}
package com.my.demo.common.config;
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.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
@Configuration
public class ParamSerializeConfig {
private static final String LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static final String LOCAL_DATE = "yyyy-MM-dd";
private static final String LOCAL_TIME = "HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer builderCustomizer(){
return bulider -> {
bulider.serializerByType(LocalDateTime.class, localDateTimeSerializer());
bulider.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());
bulider.serializerByType(LocalDate.class, localDateSerializer());
bulider.deserializerByType(LocalDate.class, localDateDeserializer());
bulider.serializerByType(LocalTime.class, localTimeSerializer());
bulider.deserializerByType(LocalTime.class, localTimeDeserializer());
};
}
@Bean
public static LocalDateTimeSerializer localDateTimeSerializer(){
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
}
@Bean
public static LocalDateTimeDeserializer localDateTimeDeserializer(){
return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(LOCAL_DATE_TIME_FORMAT));
}
@Bean
public static LocalDateSerializer localDateSerializer(){
return new LocalDateSerializer(DateTimeFormatter.ofPattern(LOCAL_DATE));
}
@Bean
public static LocalDateDeserializer localDateDeserializer(){
return new LocalDateDeserializer(DateTimeFormatter.ofPattern(LOCAL_DATE));
}
@Bean
public static LocalTimeSerializer localTimeSerializer(){
return new LocalTimeSerializer(DateTimeFormatter.ofPattern(LOCAL_TIME));
}
@Bean
public static LocalTimeDeserializer localTimeDeserializer(){
return new LocalTimeDeserializer(DateTimeFormatter.ofPattern(LOCAL_TIME));
}
}
