【发布时间】:2016-10-26 06:26:34
【问题描述】:
使用 Spring RestControllers 和 Jackson JSON 解析后端,前端使用 AngularJS。我正在寻找一种有效的方法让杰克逊将 Instant 序列化为纪元毫秒,以便随后方便地使用 JavaScript 代码。 (在浏览器端,我希望通过 Angular 的 Date Filter: {{myInstantVal | date:'short' }} 为我提供所需的日期格式。)
在 Java 方面,Jackson 将使用的 getter 很简单:
public Instant getMyInstantVal() { return myInstantVal; }
序列化不会按原样工作,因为jackson-datatype-jsr310 默认情况下不会为 Instant 返回 Epoch 毫秒。我考虑将 @JsonFormat 添加到上面的 getter 以将 Instant 变成前端可以使用的东西,但它存在两个问题:(1)我可以提供的模式显然仅限于 SimpleDateFormat 不提供一个“纪元毫秒”选项,以及 (2) 当我尝试将 Instant 作为格式化日期发送到浏览器时,Jackson 抛出异常,因为 @JsonFormat 注释需要 Instant 的 TimeZone 属性,这是我不希望的硬编码,因为它会因用户而异。
到目前为止,我的解决方案(并且工作正常)是使用@JsonGetter 创建一个替换getter,这导致Jackson 使用此方法来序列化myInstantVal:
@JsonGetter("myInstantVal")
public long getMyInstantValEpoch() {
return myInstantVal.toEpochMilli();
}
这是正确的做法吗?或者是否有一个很好的注释我可以放在 getMyInstantVal() 上,这样我就不必创建这些额外的方法?
【问题讨论】:
标签: json spring jackson java-time