@JsonDeserialize注解的使用

@JsonDeserialize注解的使用

问题描述:

某次上线项目之后,把数据保存的数据创建时间也回传到前端了,前端会把后端所有的数据都传到后端,这个Date类型的字段后端解析不了,导致调用接口一直出现错误。

原因分析:

后端接收创建时间字段的时候没有格式化为后端可以识别的Date类型

解决方案:

在接收前端传过来的实体类上增加@JsonDeserialize注解。

@JsonDeserialize(using = DateTimeJsonDeserializer.class)
private Date createTime; // 创建时间

@JsonDeserialize作用:反序列化对参数进行封装
DateTimeJsonDeserializer是写的实现对Date类型参数进行的封装格式化类。该类需要继承 JsonDeserializer 类,并重写 deserialize()方法。
具体实现:

private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	@Override
	public Date deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
		try {
			return format.parse(jsonParser.getText());
		} catch (ParseException e) {
			return null;
		}
	}
### 解释@JsonDeserialize注解 @JsonDeserialize注解属于Jackson库的一部分,主要用于反序列化过程中的定制化操作。当应用程序接收到JSON字符串并希望将其转换成Java对象时,可以利用此注解指定如何解析某些类型的字段或属性[^1]。 对于@JsonDeserialize#as参数而言,其作用是在多态情况下指明具体应该实例化的子类类型。这意味着如果父类有多个子类,在读取JSON数据创建相应对象的时候,可以通过设置`@JsonDeserialize(as=ConcreteSubclass.class)`来指示Jackson应当使用哪一个确切的实现类来进行实例化。 另外,@JsonDeserialize还可以配合using参数一起工作,用来定义自定义的Deserializer逻辑。例如,为了应对日期时间戳精度损失的问题或者任何其他特殊的数据映射需求,开发者能够编写自己的Deserializers并通过该参数关联到目标字段上[^3]。 ```java public class CustomDeserializerExample { @JsonDeserialize(using = CustomTypeDeserializer.class) private MyCustomType customField; } ``` #### 实现自定义反序列化器 要创建一个自定义的反序列化器,通常做法是扩展`StdDeserializer<T>`泛型类,并覆盖其中的关键方法如`deserialize()`。下面给出的是针对Date类型的一个简单例子: ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; import java.util.Date; public class TimestampToDateDeserializer extends StdDeserializer<Date> { protected TimestampToDateDeserializer() { super(Date.class); } @Override public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { Long timestamp = p.getValueAsLong(); return new Date(timestamp * 1000L); // 将秒级的时间戳转回毫秒级别 } } ``` 随后可以在实体类中应用这个新的反序列化器: ```java public class EntityWithTimestamp { @JsonDeserialize(using = TimestampToDateDeserializer.class) private Date creationTime; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值