vertical - swing fillers java
¿Cómo deserializo las marcas de tiempo que están en segundos con Jackson? (3)
Tengo algunos JSON que tienen marcas de tiempo en segundos (es decir, una marca de tiempo de Unix):
{"foo":"bar","timestamp":1386280997}
Pedirle a Jackson que deserialice esto en un objeto con un campo DateTime para los resultados de la marca de tiempo en 1970-01-17T01:11:25.983Z
, un tiempo poco después de la época porque Jackson asume que está en milisegundos . Aparte de destrozar el JSON y agregar algunos ceros, ¿cómo podría lograr que Jackson comprenda la marca de hora de los segundos ?
Escribí un deserializer personalizado para manejar las marcas de tiempo en segundos (sintaxis 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
}
}
}
Y luego anoté mi POGO para usar eso para la marca de tiempo:
class TimestampThing {
@JsonDeserialize(using = UnixTimestampDeserializer.class)
DateTime timestamp
@JsonCreator
public TimestampThing(@JsonProperty(''timestamp'') DateTime timestamp) {
this.timestamp = timestamp
}
}
Un enfoque muy similar al de @DrewStephens''s, que utiliza la API de Java SE TimeUnit
(introducida en JDK1.5
) en lugar de la concatenación de cadenas simples y es, por lo tanto, un poco más limpio y expresivo:
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)));
}
}
Especificando su deserializador personalizado ( UnixTimestampDeserializer
) en los campos de Date
afectados:
@JsonDeserialize(using = UnixTimestampDeserializer.class)
private Date updatedAt;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="s")
public Date timestamp;
edición : vivek-kothari sugerencia
@JsonFormat(shape=JsonFormat.Shape.NUMBER, pattern="s")
public Timestamp timestamp;