【问题标题】:Json response not generated as expected using @JsonCreator andd @JsonProperty使用 @JsonCreator 和 @JsonProperty 未按预期生成 Json 响应
【发布时间】:2014-12-09 19:08:44
【问题描述】:

我正在使用 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 响应消息,但应该是 12/08/2014。 我还需要写什么吗?

我尝试关注Jackson wiki page 文章。

编辑:

在与@Sotirios Delimanolis 讨论的基础上,我在getter 方法上尝试了JsonValue 注释,它起作用了。

  @JsonValue
  public String getDateString(){
        return dateString;
  }

【问题讨论】:

    标签: java json spring annotations jackson


    【解决方案1】:

    您的类型是java.sql.Date,这是一个java.util.Date,被认为是杰克逊的特殊类型。默认情况下,它会将日期(java.util.Date 类型的实例)写入时间戳。您可以使用

    禁用此功能
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    

    或您的 Jackson 版本的相应配置。

    然而,这会给你类似的东西

    "2014-12-08T08:00:00.000+0000"
    

    它不会使用您的SimpleDateFormat。您可以像这样使用ObjectMapper 注册DateFormat

    objectMapper.setDateFormat(new SimpleDateFormat("MM/dd/yyyy"));
    

    最好的解决方案是使用组合而不是继承。不要直接或间接扩展java.util.Date

    【讨论】:

    • 让我解释一下组合问题,我的类现在在我的应用程序中有一个 java.sql.Date 类型的变量我使用日期格式 MMddyyyy ,这不是 java.sql.Date 的默认值。所以我必须在发送 json 响应和接收 json 响应之前更改日期格式。所以我用我的自定义日期格式创建了一个自定义类。要自定义序列化,我正在尝试使用 @JsonCreator
    • 我认为所有 java.util.Date 类型的类都不被认为是特殊的,因为当我在我的 getter 方法上使用 JsonValue 注释时,我得到了所需的 json 格式。唯一的问题是 JsonValue 对反序列化没有帮助。
    • @Vipin 注意javadoc类似于 XmlValue 的标记注解,表示带注解的“getter”方法的结果(这意味着签名必须是 getter 的签名;非 void 返回类型, 无 args) 将用作 单个值 为实例序列化。 Jackson 不会序列化您的 MyDate 实例,它将使用其 @JsonValue 带注释的 getter 来序列化返回的值,即 String
    • @Vipin 好的,慢点。我的回答解释了您在问题中提出的有关如何获取"12/08/2014" 而不是1417977000000 的问题。如果这不是您要查找的内容,请编辑您的问题或提出新问题。我有点迷失了你现在在寻找什么。
    • @Vipin 没有纯粹的基于注释的方法。当然您可以使用@JsonSerialize,但您需要编写自己的JsonSerializer。所以要么你这样做,要么你配置你的ObjectMapper。或者,但这将要求您准确显示您想要生成的 JSON 以供任何人帮助您,您可以停止扩展 java.sql.Date
    【解决方案2】:

    如果您不想使用通用解决方案,您可以随时设置每个属性的格式

    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 和明确的时区定义。

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多