JSON Сериализация даты в пользовательском формате (не удается создать экземпляр java.util.Date из значения String) - программирование
Подтвердить что ты не робот

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));
}
4b9b3361

Ответ 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

  1. Если вы хотите привязать строку JSON к дате, этот процесс называется deserialization, а не serialization.
  2. Чтобы привязать строку 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
}
  1. Написать пример кода CustomDateAndTimeDeserialize.java