yyyy hora formato formatear fechas fecha dar convertir json spring-mvc jackson fasterxml

hora - json date to dd/mm/yyyy



Fecha de serialización JSON en un formato personalizado(No se puede construir la instancia de java.util.Date desde el valor de la cadena) (4)

could not read JSON: Can not construct instance of java.util.Date from String value ''2012-07-21 12:11:12'': not a valid representation("yyyy-MM-dd''T''HH:mm:ss.SSSZ", "yyyy-MM-dd''T''HH:mm:ss.SSS''Z''", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))

al pasar la solicitud json al método del controlador REST en una clase POJO. el usuario debe ingresar solo en el formato de fecha y hora por debajo de lo que debería arrojar el mensaje. ¿Por qué DateSerializer no está llamando?

add(@Valid @RequestBody User user) { }

json:

{ "name":"ssss", "created_date": "2012-07-21 12:11:12" }

variable de clase pojo

@JsonSerialize(using=DateSerializer.class) @Column @NotNull(message="Please enter a date") @Temporal(value=TemporalType.TIMESTAMP) private Date created_date; public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { logger.info("serialize:"+value); DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); logger.info("DateSerializer formatter:"+formatter.format(value)); jgen.writeString(formatter.format(value)); }


  1. Si desea vincular una cadena JSON a la fecha, este proceso se denomina "deserialización", no serialización.
  2. Para enlazar una cadena JSON a la fecha, crear una deserialización de fecha personalizada, anotar "fecha_creado" o su configurador con @JsonDeserialize (utilizando = YourCustomDateDeserializer.class) donde debe implementar el método "public Date deserialize (...)" para contar Jackson cómo convertir una cadena en una fecha.

Disfrutar.


Haga una anotación en el campo fecha_creado con la anotación JsonFormat para especificar el formato de salida.

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")


Otra forma es tener un objeto Date personalizado que se encargue de su propia serialización.

Aunque realmente no creo que extender objetos simples como Date , Long , etc. es una buena práctica, en este caso particular hace que el código sea fácil de leer, tiene un único punto donde el formato está definido y es más que menos compatible con objeto de Date normal.

public class CustomFormatDate extends Date { private DateFormat myDateFormat = ...; // your date format public CustomFormatDate() { super(); } public CustomFormatDate(long date) { super(date); } public CustomFormatDate(Date date) { super(date.getTime()); } @JsonCreator public static CustomFormatDate forValue(String value) { try { return new CustomFormatDate(myDateFormat.parse(value)); } catch (ParseException e) { return null; } } @JsonValue public String toValue() { return myDateFormat.format(this); } @Override public String toString() { return toValue(); } }


Tengo el mismo problema, entonces escribo una deserialización de fecha personalizada con @JsonDeserialize(using=CustomerDateAndTimeDeserialize.class)

public class CustomerDateAndTimeDeserialize extends JsonDeserializer<Date> { private SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); @Override public Date deserialize(JsonParser paramJsonParser, DeserializationContext paramDeserializationContext) throws IOException, JsonProcessingException { String str = paramJsonParser.getText().trim(); try { return dateFormat.parse(str); } catch (ParseException e) { // Handle exception here } return paramDeserializationContext.parseDate(str); } }