JSON Сериализация даты в пользовательском формате (не удается создать экземпляр java.util.Date из значения String)
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"))
Передача json-запроса методу контроллера REST в POJO-классе. Пользователь должен указывать только в формате ниже datetime, иначе он должен вызывать message.why DateSerializer не вызывает?
add(@Valid @RequestBody User user)
{
}
json:
{
"name":"ssss",
"created_date": "2012-07-21 12:11:12"
}
переменная класса 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
У меня такая же проблема, поэтому я пишу произвольную десериализацию даты
с @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);
}
}
Ответ 2
Аннотировать created_date
поле с JsonFormat
аннотацию, чтобы указать формат вывода.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())
Обратите внимание, что вам может потребоваться передать другой Locale и TimeZone, если они должны основываться не на том, что использует сервер.
Вы можете узнать больше информации в документах.
Ответ 3
- Если вы хотите привязать строку
JSON
к дате, этот процесс называется deserialization
, а не serialization
. -
Чтобы привязать строку JSON
к дате, создайте индивидуальную десериализацию даты, аннотируйте created_date
или ее сеттер с
@JsonDeserialize(using=YourCustomDateDeserializer.class)
где вы должны реализовать метод public Date deserialize(...)
чтобы сообщить Jackson, как преобразовать строку в дату.
Наслаждаться.
Ответ 4
Еще один способ - создать пользовательский объект Date, который позаботится о его собственной сериализации.
Хотя я действительно не думаю, что расширение простых объектов, таких как Date
, Long
и т.д., является хорошей практикой, в данном конкретном случае он делает код легко читаемым, имеет одну точку, в которой определяется формат и более чем менее совместим с обычным объектом Date
.
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();
}
}
Ответ 5
Я решил это с помощью следующих шагов.
1. В классе сущности отметьте это, используя @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
}
- Написать пример кода CustomDateAndTimeDeserialize.java