使用@JsonCreator和@JsonProperty未按预期生成Json响应

时间:2014-12-09 19:08:45

标签: java json spring annotations jackson

我正在使用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;
  }

2 个答案:

答案 0 :(得分:3)

您的类型是java.sql.Datejava.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和显式时区定义。