Saltar al contenido

serializar/deserializar java 8 java.time con el mapeador Jackson JSON

Después de investigar con expertos en este tema, programadores de varias áreas y maestros hemos dado con la solución al problema y la dejamos plasmada en este post.

Solución:

No hay necesidad de usar serializadores/deserializadores personalizados aquí. Use el módulo de fecha y hora de jackson-modules-java8:

Módulo de tipo de datos para que Jackson reconozca los tipos de datos de API de fecha y hora de Java 8 (JSR-310).

Este módulo agrega soporte para bastantes clases:

  • Duración
  • Instante
  • LocalDateTime
  • Fecha local
  • Hora local
  • Mes dia
  • DesplazamientoFechaHora
  • tiempo de compensación
  • Período
  • Año
  • Año mes
  • ZonedDateTime
  • ID de zona
  • Desplazamiento de zona

Actualización: dejar esta respuesta por razones históricas, pero no la recomiendo. Por favor, vea la respuesta aceptada arriba.

Dígale a Jackson que mapee usando su personalizado [de]clases de serialización:

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime ignoreUntil;

proporcionar clases personalizadas:

public class LocalDateTimeSerializer extends JsonSerializer 
    @Override
    public void serialize(LocalDateTime arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException 
        arg1.writeString(arg0.toString());
    


public class LocalDateTimeDeserializer extends JsonDeserializer 
    @Override
    public LocalDateTime deserialize(JsonParser arg0, DeserializationContext arg1) throws IOException 
        return LocalDateTime.parse(arg0.getText());
    

hecho aleatorio: si anido encima de las clases y no las hago staticel mensaje de error es raro:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

Si está utilizando la clase ObjectMapper de fastxml, de forma predeterminada, ObjectMapper no comprende la clase LocalDateTime, por lo que debe agregar otra dependencia en su gradle/maven:

compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.7.3'

Ahora necesita registrar el soporte de tipo de datos ofrecido por esta biblioteca en su objeto mapeador de objetos, esto se puede hacer de la siguiente manera:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();

Ahora, en su jsonString, puede colocar fácilmente su campo java.LocalDateTime de la siguiente manera:


    "user_id": 1,
    "score": 9,
    "date_time": "2016-05-28T17:39:44.937"

Al hacer todo esto, la conversión de su archivo Json a objeto Java funcionará bien, puede leer el archivo siguiendo:

objectMapper.readValue(jsonString, new TypeReference>() 
            );

Si tienes algún impasse o capacidad de afinar nuestro división eres capaz de añadir una nota y con deseo lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *