如何反序列化 Jackson 以秒为单位的时间戳?

2022-09-01 04:28:13

我有一些JSON,时间戳以秒为单位(即Unix时间戳):

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

要求 Jackson 将其反序列化为一个带有 DateTime 字段作为时间戳的对象,结果为 ,时间紧接在纪元之后,因为 Jackson 假设它是以毫秒为单位的。除了拆开JSON并添加一些零之外,我如何让Jackson理解时间戳?1970-01-17T01:11:25.983Z


答案 1

我编写了一个自定义反序列化程序来处理秒内的时间戳(Groovy 语法)。

class UnixTimestampDeserializer extends JsonDeserializer<DateTime> {
    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
    }
}

答案 2
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="s")
public Date timestamp;

编辑:vivek-kothari建议

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