我正在使用JDK 1.6,Jackson 2.0.5,Spring 3.0.3并使用jackson注释来序列化和反序列化json响应。
public class MyDate extends java.sql.Date{
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy");
private String dateString;
@JsonCreator
public MyDate(@JsonProperty("dateString") String date){
super(simpleDateFormat.parse(date).getTime());
dateString = date;
}
public String getDateString(){
return dateString;
}
private final setDateString(String date){
// .....
}
}
我收到像1417977000000这样的json响应消息,但它应该像2014年8月12日。 我还需要写其他什么吗?
我试图关注Jackson wiki page文章。
编辑:
在与@Sotirios Delimanolis讨论的基础上,我在getter方法上尝试了JsonValue注释并且它有效。
@JsonValue
public String getDateString(){
return dateString;
}
答案 0 :(得分:3)
您的类型是java.sql.Date
,java.util.Date
是杰克逊特有的。默认情况下,它将日期(类型java.util.Date
的实例)写为其时间戳。您可以使用
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
或您的杰克逊版本的相应配置。
然而,这会给你类似的东西
"2014-12-08T08:00:00.000+0000"
它不会使用您的SimpleDateFormat
。您可以DateFormat
注册ObjectMapper
,如此
objectMapper.setDateFormat(new SimpleDateFormat("MM/dd/yyyy"));
最好的解决方案是使用组合而不是继承。不要直接或间接延长java.util.Date
。
答案 1 :(得分:3)
如果您不想使用常规解决方案,则可以随时设置每个属性的格式
public class DateStuff {
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd,HH:00", timezone="CET")
public Date creationTime;
}
有关详情,请参阅此处:http://wiki.fasterxml.com/JacksonFAQDateHandling
编辑:
作为旁注
(又名"请不要使用java.sql.Date,永远!")
虽然Jackson支持java.sql.Date,但是已知有问题 尊重时区处理,部分原因是本课程的设计。它 如果可能,建议尽量避免使用此类型 而是使用java.util.Date(或java.util.Calendar)。如果不是这样的话 可能,应用程序可能需要转换这些日期 使用java.util.Calendar和显式时区定义。