jackson自定义序列化和反序列化
自定义序列化
- 序列化主要作用在返回数据的时候
- 以BigDecimal统一返回3位小数为例
- 自定义序列化处理类
- 继承jackson的
JsonSerializer
类,重写serialize
方法
/**
* @author liouwb
*/
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
@Override
public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializers) throws IOException {
jsonGenerator.writeString(formatBigDecimal(value));
}
/**
* 保留3位小数
*/
private String formatBigDecimal(BigDecimal value) {
if (Objects.nonNull(value) && value.compareTo(BigDecimal.ZERO) >= 0) {
DecimalFormat df = new DecimalFormat();
df.applyPattern("0.000");
return df.format(value);
}
return null;
}
}
- 使用的时候,可以直接使用Jackson的
@JsonSerialize
注解
@JsonSerialize(using = BigDecimalSerializer.class)
private BigDecimal amount;
自定义反序列化
- 接收前端传入数据
- 继承
JsonDeserializer
类,重写deserialize
方法 - 例子:后端传入前端的图片链接,去掉域名,只保存path部分
/**
* @author liouwb
*/
public class StaticUrlDeserialize extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
// 前端传入数据
String text = jsonParser.getText();
// 域名前缀
String domain = "https://domain/";
// 去掉域名保留path
String path = text.replace(domain, "");
return path;
}
}
- 使用的时候,可以直接使用Jackson的
@JsonDeserialize
注解
@ApiModelProperty(value = "用户头像", position = 6)
@JsonDeserialize(using = StaticUrlDeserialize.class)
private String avatar;
统一配置自定义序列化、反序列化
- 也可以使用全局统一配置
- 统一处理
BigDecimal
返回格式和日期
/**
* @author liouwb
*/
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper ObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule simpleModule = new SimpleModule();
// 自定义序列化BigDecimal
simpleModule.addSerializer(BigDecimal.class, new BigDecimalSerializer());
// 自定义日期的序列化和反序列化
simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
simpleModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
simpleModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
simpleModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
文章来源地址https://www.toymoban.com/news/detail-636180.html
文章来源:https://www.toymoban.com/news/detail-636180.html
到了这里,关于jackson自定义序列化反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!