29
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 请求传递给 POJO 类中的 REST 控制器方法。用户应仅以以下日期时间格式输入,否则应抛出消息。为什么 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));
}
4

7 回答 7

53

使用注释对您的created_date字段进行JsonFormat注释以指定输出格式。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())

请注意,如果它们应该基于服务器使用的其他内容,您可能需要传入不同的 Locale 和 TimeZone。

您可以在文档中找到更多信息。

于 2014-11-25T16:12:07.060 回答
20

我有同样的问题,所以我写了一个自定义日期反序列化@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);
    }
}
于 2014-11-19T02:27:05.440 回答
1
  1. 如果要将JSON字符串绑定到日期,则此过程称为deserialization,而不是serialization
  2. 要将JSON字符串绑定到日期,请创建自定义日期反序列化、注释created_date或其设置器

    @JsonDeserialize(using=YourCustomDateDeserializer.class)

您必须在其中实现public Date deserialize(...)告诉杰克逊如何将字符串转换为日期的方法。

享受。

于 2013-08-17T10:55:11.343 回答
0

另一种方法是拥有一个自定义的 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();
    }
}
于 2015-03-26T11:17:50.947 回答
0

我通过使用以下步骤解决了这个问题。

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示例代码
于 2019-05-26T09:25:25.130 回答
0

对于某人,如果您使用 DTO/VO/POJO 来映射您的请求,您可以简单地注释您的日期字段

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date customerRegDate;

json请求应该是:

{
"someDate":"2020-04-04 16:11:02"
}

您不需要注释 Entity 类变量。

于 2020-04-04T11:14:53.873 回答
0

我需要用@JsonFormat和之后进行注释,这很好用:

@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern = "MM-dd-yyyy")
@JsonFormat(pattern = "MM-dd-yyyy")
private java.util.Date expDate;
于 2021-11-14T06:25:05.103 回答