杰克逊错误地用自定义日期格式反序化Joda日期

时间:2015-11-17 11:54:07

标签: java jackson jodatime

我正在尝试使用自定义日期格式序列化和反序列化非常简单的对象:

public class DateTimeTest {
    private static final String DATE_PATTERN = "yyyyMMdd";

    public static DateTime date = DateTime.now();

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JodaModule());
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        ObjectWriter writer = mapper.writer();

        String str = writer.writeValueAsString(new Domain());
        System.out.println(str);

        ObjectReader reader = mapper.reader(Domain.class);
        Domain domain = reader.readValue(str);

        System.out.println(domain.getDate());
    }

    private static class Domain {
        @JsonFormat(pattern = DATE_PATTERN)
        private DateTime date;

        public Domain() {
            this.date = DateTime.now();
        }

        public DateTime getDate() {
            return date;
        }

        public void setDate(DateTime date) {
            this.date = date;
        }
    }
}

执行main方法时,我希望得到类似的东西:

  

“日期”: “20151117”
  20151117

但不幸的是得到以下内容:

  

{ “日期”: “20151117”}
   20151117 -01-01T00:00:00.000 + 03:00(年份不正确

似乎Jackson忽略对象反序列化的@JsonFormat注释,并将该字符串视为ISO-8601表示法中的日期。有谁知道修复?

<jackson.version>2.5.4</jackson.version>
<jodatime.version>2.8.1</version>

更新:如果我将日期模式更改为“dd / MM / yyyy”,那么我甚至会开始收到错误“IllegalArgumentException:Invalid format”。所以杰克逊肯定会忽略反序列化的日期模式。

4 个答案:

答案 0 :(得分:1)

根据Jackson Release Notes对Joda @JsonFormat(pattern = ...)的支持,反序列化仅从2.6.0版本中添加。

答案 1 :(得分:0)

您需要将形状添加到JsonFormat

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)

答案 2 :(得分:0)

&#13;
&#13;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")
&#13;
&#13;
&#13;

如果没有确切的模式格式,请尝试此

http://wiki.fasterxml.com/JacksonFAQDateHandling

Set Jackson Timezone for Date deserialization

因为我不确定即使你保持甲酸盐结果也没有获得结果...通过以上链接..可能会帮助你

答案 3 :(得分:0)

有什么问题?你得到了正确的序列化和去实现。输出&#34; 20151117-01-01T00:00:00.000 + 03:00&#34;它只是DateTime.toString()的结果。