如何反映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;
- Hibernate用户和朋友JsonReference
- Jersey,Jackson和JAX-RS POST多种JSON格式
- 使用jackson创建简单的JSON结构
- Jackson ObjectMapper DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
- jackson解析json与unwraping root,但没有能力设置@JsonRootName
- 与JS.fasterxml.jackson JacksonJaxbJsonProvider的@XMLElementWrapper问题
- 如何使用Jackson json注释enum字段以进行反序列化
- 如何告诉jackson在反序列化期间忽略空对象?
- 在一个字段中反序列化多个类型的JSON