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.SS
I have the same problem, so I write a custom date deserialization
with @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);
}
}
For someone ,If you are using DTO/VO/POJO to map your request you can simply annotate your date field
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date customerRegDate;
And json request should be:
{
"someDate":"2020-04-04 16:11:02"
}
You don't need to annotate Entity class variable.
I solved this by using the below steps.
1.In entity class annote it using @JsonDeserialize
@Entity
@Table(name="table")
public class Table implements Serializable {
// Some code
@JsonDeserialize(using= CustomerDateAndTimeDeserialize.class)
@Temporal(TemporalType.TIMESTAMP)
@Column(name="created_ts")
private Date createdTs
}
Yet another way is to have a custom Date object which takes care of its own serialization.
While I don't really think extending simple objects like Date
, Long
, etc. is a good practice, in this particular case it makes the code easily readable, has a single point where the format is defined and is rather more than less compatible with normal Date
object.
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();
}
}
Annotate your created_date
field with the JsonFormat
annotation to specify the output format.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())
Note that you may need to pass in a different Locale and TimeZone if they should be based on something other than what the server uses.
You can find out more information in the docs.
JSON
string to date, this process is called deserialization
, not serialization
.To bind a JSON
string to date, create a custom date deserialization, annotate created_date
or its setter with
@JsonDeserialize(using=YourCustomDateDeserializer.class)
where you have to implement the method public Date deserialize(...)
to tell Jackson how to convert a string to a date.
Enjoy.