Saltar al contenido

Asignación de formato de fecha a JSON Jackson

Luego de observar en diversos repositorios y sitios al final descubrimos la solución que te enseñamos aquí.

Solución:

Desde Jackson v2.0, puede usar la anotación @JsonFormat directamente en miembros de Object;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm a z")
private Date date;

¿Cuál es el formato que necesito usar para realizar la conversión con Jackson? ¿Fecha es un buen tipo de campo para esto?

Date es un buen tipo de campo para esto. Puede hacer que el JSON sea analizable con bastante facilidad usando ObjectMapper.setDateFormat:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm a z");
myObjectMapper.setDateFormat(df);

En general, ¿hay alguna forma de procesar las variables antes de que Jackson las asigne a los miembros de Object? Algo como cambiar el formato, los cálculos, etc.

Si. Tiene algunas opciones, incluida la implementación de un JsonDeserializer, por ejemplo, extendiendo JsonDeserializer. Este es un buen comienzo.

Por supuesto hay una forma automatizada llamado serialización y deserialización y puede definirlo con anotaciones específicas (@JsonSerialize,@JsonDeserialize) como también lo menciona pb2q.

Puede usar tanto java.util.Date como java.util.Calendar … y probablemente también JodaTime.

Las anotaciones de @JsonFormat no me funcionaron como quería (Tiene ajustó la zona horaria a un valor diferente) durante la deserialización (la serialización funcionó a la perfección):

@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "CET")

@JsonFormat(locale = "hu", shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "Europe/Budapest")

Debe usar un serializador personalizado y un deserializador personalizado en lugar de la anotación @JsonFormat si desea un resultado predicho. He encontrado un tutorial y una solución realmente buenos aquí http://www.baeldung.com/jackson-serialize-dates

Hay ejemplos para Fecha campos pero necesitaba para Calendario campos así aquí está mi implementación:

El serializador clase:

public class CustomCalendarSerializer extends JsonSerializer 

    public static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    public static final Locale LOCALE_HUNGARIAN = new Locale("hu", "HU");
    public static final TimeZone LOCAL_TIME_ZONE = TimeZone.getTimeZone("Europe/Budapest");

    @Override
    public void serialize(Calendar value, JsonGenerator gen, SerializerProvider arg2)
            throws IOException, JsonProcessingException 
        if (value == null) 
            gen.writeNull();
         else 
            gen.writeString(FORMATTER.format(value.getTime()));
        
    

El deserializador clase:

public class CustomCalendarDeserializer extends JsonDeserializer 

    @Override
    public Calendar deserialize(JsonParser jsonparser, DeserializationContext context)
            throws IOException, JsonProcessingException 
        String dateAsString = jsonparser.getText();
        try 
            Date date = CustomCalendarSerializer.FORMATTER.parse(dateAsString);
            Calendar calendar = Calendar.getInstance(
                CustomCalendarSerializer.LOCAL_TIME_ZONE, 
                CustomCalendarSerializer.LOCALE_HUNGARIAN
            );
            calendar.setTime(date);
            return calendar;
         catch (ParseException e) 
            throw new RuntimeException(e);
        
    

y el uso de las clases anteriores:

public class CalendarEntry 

    @JsonSerialize(using = CustomCalendarSerializer.class)
    @JsonDeserialize(using = CustomCalendarDeserializer.class)
    private Calendar calendar;

    // ... additional things ...

Usando esta implementación, la ejecución del proceso de serialización y deserialización da como resultado consecutivamente el valor de origen.

Solo usando la anotación @JsonFormat, la deserialización da un resultado diferente Creo que debido a la configuración predeterminada de la zona horaria interna de la biblioteca, lo que no se puede cambiar con los parámetros de anotación (esa fue mi experiencia con la versión 2.5.3 y 2.6.3 de la biblioteca Jackson también).

Aquí tienes las comentarios y valoraciones

¡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 *