如何反映杰克逊在几秒钟内的时间戳?

Dre*_*ens 27 java json timestamp unix-timestamp jackson

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

{"foo":"bar","timestamp":1386280997}
Run Code Online (Sandbox Code Playgroud)

要求杰克逊将其反序列化为具有时间戳的DateTime字段的对象,这1970-01-17T01:11:25.983Z是因为杰克逊假设它在几毫秒内,所以在纪元之后不久.除了撕掉JSON并添加一些零之外,我怎样才能让杰克逊了解时间戳?

Dre*_*ens 25

我写了一个自定义反序列化器来处理时间戳(几秒钟)(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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class TimestampThing {
    @JsonDeserialize(using = UnixTimestampDeserializer.class)
    DateTime timestamp

    @JsonCreator
    public TimestampThing(@JsonProperty('timestamp') DateTime timestamp) {
        this.timestamp = timestamp
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你可以使用java8,你可能会对使用`java.time.Instant`类感兴趣并使用常规的jackson [datatypes](https://github.com/FasterXML/jackson-modules-java8/).这样你只需要`@JsonProperty("timestamp")私有即时时间戳 (5认同)

she*_*pya 13

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="s")
public Date timestamp;
Run Code Online (Sandbox Code Playgroud)

编辑:vivek-kothari建议

@JsonFormat(shape=JsonFormat.Shape.NUMBER, pattern="s")
public Timestamp timestamp;
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用,因为它{{s}}意味着不是自1970年以来的秒数,它意味着"给定"日期的秒数(0..59) (3认同)

Pri*_*mre 10

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

public class UnixTimestampDeserializer extends JsonDeserializer<Date> {

    @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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@JsonDeserialize(using = UnixTimestampDeserializer.class)
private Date updatedAt;
Run Code Online (Sandbox Code Playgroud)