java - jackson date format
Jackson deserializa ISO8601 desde la fecha y la hora hasta Java8 Instant (3)
Estoy intentando deserializar una fecha con formato ISO8601 en Java8 Instant usando Jackson. Registré JavaTimeModule con el ObjectMapper, desactivé WRITE_DATES_AS_TIMESTAMPS.
Sin embargo, si se intenta deserializar 2016-03-28T19: 00: 00.000 + 01: 00 no funcionará, porque parece que JavaTimeModule solo deserializará las fechas y los tiempos con formato de desplazamiento UTC de zona horaria (por ejemplo, 2016-03-28T18: 00 : 00.000Z). Luego intenté usar la anotación @JsonFormat de esta manera:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd''T''HH:mm:ss.SSSZ", timezone = "UTC")
Y así:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd''T''HH:mm:ss.SSSZ", timezone = JsonFormat.DEFAULT_TIMEZONE)
Sin embargo, ninguno de estos trabajos y me sale una excepción:
com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])
Lo que implica que el parámetro de zona horaria se ignora y el formateador de fecha y hora no sabe cómo formatear un Instant sin una zona horaria.
¿Hay una manera de deserializar una cadena ISO8601 que no esté en la zona horaria UTC con Java 8 Instant utilizando Jackson y JavaTimeModule sin escribir deserializador personalizado?
Debe establecer la zona horaria explícita a través de XXX
en su clase de modelo:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd''T''HH:mm:ss.SSSXXX")
private Date date;
(consulte: docs.oracle.com/javase/7/docs/api/java/text/… )
El formato "Z" no funciona con "+01: 00" ya que este es un patrón diferente. JsonFormat está utilizando patrones SimpleDateFormat. "Z" en mayúsculas solo representa el estricto RFC 822. Debe usar una sintaxis como: "+0100", sin dos puntos.
Si desea serializar objetos de Date
en ISO-8601, no necesita especificar un patrón en absoluto: ISO-8601 es el patrón predeterminado. Es algo mencionado en el documento JsonFormat
Java :
Los usos comunes incluyen elegir entre representaciones alternativas, por ejemplo, si la Fecha se va a serializar como número (marca de tiempo de Java) o Cadena (como el valor de tiempo compatible con ISO-8601) , así como configurar detalles exactos con la propiedad pattern ().
[el énfasis es mío], del texto anterior, debe comprender que especificar shape = STRING
significaría un formato ISO-8601, pero puede elegir otra cosa utilizando la propiedad del pattern
.
En mi experiencia, esto siempre resulta un formato de fecha UTC (con la zona horaria representada como +0000
), que podría ser la zona horaria predeterminada en mi VM (aunque el reloj de mi sistema operativo no esté configurado en UTC).