Jackson 使用自定义日期格式错误地反序列化 Joda 日期
Jackson incorrectly deserialize Joda dates with custom date format
我正在尝试使用自定义日期格式序列化和反序列化非常简单的对象:
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 方法时,我希望得到类似于以下内容的内容:
"date":"20151117"
20151117
但不幸得到以下信息:
{"date":"20151117"}
20151117-01-01T00:00:00.000+03:00 (year is incorrect)
Jackson 似乎忽略了对象反序列化的 @JsonFormat 注释,并将字符串视为 ISO-8601 表示法中的日期。有人知道解决方法吗?
<jackson.version>2.5.4</jackson.version>
<jodatime.version>2.8.1</version>
更新:如果我将日期模式更改为 "dd/MM/yyyy",那么我什至开始收到错误 "IllegalArgumentException: Invalid format"。所以杰克逊肯定会忽略反序列化的日期模式。
您需要将形状添加到 JsonFormat
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")
如果没有确切的模式格式,试试这个
http://wiki.fasterxml.com/JacksonFAQDateHandling
Set Jackson Timezone for Date deserialization
因为我不确定即使你保持甲酸盐巢穴也没有获得结果......通过上面的link..它可能对你有帮助
有什么问题?你得到了正确的序列化和反序列化。输出“20151117-01-01T00:00:00.000+03:00”就是 DateTime.toString().
的结果
根据 Jackson Release Notes 仅从 2.6.0 版本添加了对 Joda @JsonFormat(pattern=...) 反序列化的支持。
我正在尝试使用自定义日期格式序列化和反序列化非常简单的对象:
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 方法时,我希望得到类似于以下内容的内容:
"date":"20151117"
20151117
但不幸得到以下信息:
{"date":"20151117"}
20151117-01-01T00:00:00.000+03:00 (year is incorrect)
Jackson 似乎忽略了对象反序列化的 @JsonFormat 注释,并将字符串视为 ISO-8601 表示法中的日期。有人知道解决方法吗?
<jackson.version>2.5.4</jackson.version>
<jodatime.version>2.8.1</version>
更新:如果我将日期模式更改为 "dd/MM/yyyy",那么我什至开始收到错误 "IllegalArgumentException: Invalid format"。所以杰克逊肯定会忽略反序列化的日期模式。
您需要将形状添加到 JsonFormat
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")
如果没有确切的模式格式,试试这个
http://wiki.fasterxml.com/JacksonFAQDateHandling
Set Jackson Timezone for Date deserialization
因为我不确定即使你保持甲酸盐巢穴也没有获得结果......通过上面的link..它可能对你有帮助
有什么问题?你得到了正确的序列化和反序列化。输出“20151117-01-01T00:00:00.000+03:00”就是 DateTime.toString().
的结果根据 Jackson Release Notes 仅从 2.6.0 版本添加了对 Joda @JsonFormat(pattern=...) 反序列化的支持。