java json datetime jackson java-8

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.

Ver: ISO 8601: 2004 , patrones SimpleDateFormat


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).