如何反映jackson在几秒钟内的时间戳?

我有一些JSON在几秒钟内有时间戳(即Unix时间戳):

{"foo":"bar","timestamp":1386280997} 

要求jackson将其反序列化为具有时间戳的DateTime字段的对象,结果是1970-01-17T01:11:25.983Z ,这是纪元之后不久的一段时间,因为jackson认为它是以毫秒为单位 。 除了撕掉JSON并添加一些零之外,我怎样才能让jackson了解时间戳?

我写了一个自定义反序列化器来处理时间戳(以秒为单位)(Groovy语法)。

 class UnixTimestampDeserializer extends JsonDeserializer { Logger logger = LoggerFactory.getLogger(UnixTimestampDeserializer.class) @Override DateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { String timestamp = jp.getText().trim() try { return new DateTime(Long.valueOf(timestamp + '000')) } catch (NumberFormatException e) { logger.warn('Unable to deserialize timestamp: ' + timestamp, e) return null } } } 

然后我注释了我的POGO将其用于时间戳:

 class TimestampThing { @JsonDeserialize(using = UnixTimestampDeserializer.class) DateTime timestamp @JsonCreator public TimestampThing(@JsonProperty('timestamp') DateTime timestamp) { this.timestamp = timestamp } } 
 @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="s") public Date timestamp; 

编辑 :vivek-kothari建议

 @JsonFormat(shape=JsonFormat.Shape.NUMBER, pattern="s") public Timestamp timestamp; 

与@ DrewStephens的方法非常类似,它使用Java SE TimeUnit API(在JDK1.5引入)而不是普通的字符串连接,因此(可以说)更清洁,更具表现力:

 public class UnixTimestampDeserializer extends JsonDeserializer { @Override public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException { String unixTimestamp = parser.getText().trim(); return new Date(TimeUnit.SECONDS.toMillis(Long.valueOf(unixTimestamp))); } } 

在受影响的Date字段上指定自定义反序列化器( UnixTimestampDeserializer ):

 @JsonDeserialize(using = UnixTimestampDeserializer.class) private Date updatedAt;