项目场景:
第三方接口返回的Json数据中,时间字段为时间戳类型,本地Mysql数据库对应的字段为LocalDateTime,为了方便Json转换对象,将该字段进行反序列化
@JsonAlias注解和@JsonProperty区别
@JsonAlias只影响反序列过程,可以传多个值,但是会覆盖
@JsonProperty影响的是序列化和反序列化,只能有对应的一个值
ps:
- Java序列化就是指把Java对象转换为字节序列的过程
- Java反序列化就是指把字节序列恢复为Java对象的过程
解决方案:
使用@JsonDeserialize和@JsonAlias注解
配置依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
DTO对象
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@Accessors(chain = true)
public class YukeUlpRealTimeDTO implements Serializable {
private static final long serialVersionUID = 1L;
@JsonAlias("message")
private String message;
@JsonAlias("code")
private String code;
@JsonAlias("status")
private Integer status;
@JsonAlias("data")
private List<YukeUlpRealTimeDTO.DataDTO> data;
@NoArgsConstructor
@Data
public static class DataDTO {
@JsonAlias("time")
private LocalDateTime uploadDate;
@JsonDeserialize(using = CustomDateDeserializer.class)
public void setUploadDate(LocalDateTime uploadDate) {
this.uploadDate = uploadDate;
}
}
}
自定义反序列化类
@Component
public class CustomDateDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
//JsonParser取出来的字段值是String 先进行转换
return LocalDateTimeUtil.of(Long.valueOf(jsonParser.getText()));
}
}
这里用的是hutool工具类转换,hutool要添加依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>