2013-07-15 163 views
16
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 class.user只应在其他明智下面日期时间格式输入它应该抛出message.Why DateSerializer没有调用?JSON序列化日期(无法从字符串值构造java.util.Date的实例)

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

回答

6

我有同样的问题,所以我写了一个自定义日期反序列化 与@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); 
    } 
} 
+0

你是如何实现这个CustomerDateAndTimeDeserialize类的? –

0
  1. 如果你要绑定一个JSON字符串到今天为止,这个过程被称为 “反序列化”,而不是序列化。
  2. 要将JSON字符串绑定到日期,请创建一个自定义日期反序列化,使用@JsonDeserialize(使用= YourCustomDateDeserializer.class)注释“created_date”或其setter(必须实现方法“public Date deserialize(...) “告诉杰克逊如何将字符串转换为日期。

享受。

32

与JsonFormat批注指定输出格式标注您CREATED_DATE场。

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

这就是你所要做的一切吗?我试过这个,它本身并不起作用。也许某些地方需要其他注释? – Dariusz

+1

您需要使用Jackson:http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonFormat.html – Splaktar

+1

请注意使用此注释。这是已知的** [问题](http://stackoverflow.com/q/31822877/2650174)**与少一天。 –

0

还有一种方法是拥有一个自定义的Date对象,它负责自己的序列化。

虽然我真的不认为扩展简单对象,如DateLong等是一个很好的做法,在它使代码易于阅读这种特殊情况下,具有这样的格式定义,是相当多的单点比较不兼容正常的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(); 
    } 
} 
相关问题