使用 Jackson 和 Spring 序列化 Joda DateTime
Serializing Joda DateTime with Jackson and Spring
我一直在使用 Spring Boot 和 Jackson-databind 2.5.2 将 Joda DateTime 从 java 序列化和反序列化为 json 并再次序列化和反序列化时遇到问题。我的 pom.xml 看起来像这样。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
当我序列化 DateTime 对象时,我得到一个表示 DateTime 的整数。实际上不是我所期望的,但是很好。但是当我去保存我的对象时,我收到以下错误...
Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'endTime';
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type org.joda.time.DateTime for value '1428600998511'
出于某种原因,它将它序列化为一个整数,然后将其反序列化为一个字符串,但事实并非如此。我还尝试在调用其余服务之前设置 endTime = new Date(intValue) 并且尝试将 'Tue Apr 28 2015 00:00:00 GMT-0700 (PDT)' 之类的字符串转换为 DateTime.
也失败了
我做错了什么?
更新:
这是我得到的 JSON 和 我试图立即 POST 马上返回。
{
id: 4,
username: "",
name: "eau",
email: "aoue",
verbatimLocation: null,
latitude: null,
longitude: null,
startTime:null,
endTime: 1429034332312,
description: "ueoa",
media: [ ],
timeSubmitted: 1428600998000,
status: null,
submissionid: null
}
最后我能够按照beerbajay所说的去做并使用...
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")
... 序列化我的约会对象。不过,我最终还是回到了使用 Long 而不是 DateTime,因为处理 javascript 端的日期太麻烦了。事实证明,要找到适用于 jquery datepicker、joda DateTime 和 postgresql 的模式,对于我仅有的一点时间来说,工作量太大了。
为了更可重用的机制,您可以创建一个 JsonSerializer
:
/**
* When passing JSON around, it's good to use a standard text representation of
* the date, rather than the full details of a Joda DateTime object. Therefore,
* this will serialize the value to the ISO-8601 standard:
* <pre>yyyy-MM-dd'T'HH:mm:ss.SSSZ</pre>
* This can then be parsed by a JavaScript library such as moment.js.
*/
public class JsonJodaDateTimeSerializer extends JsonSerializer<DateTime> {
private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
@Override
public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeString(formatter.print(value));
}
}
然后您可以使用以下方式注释您的 get
方法:
@JsonSerialize(using = JsonJodaDateTimeSerializer.class)
这使您可以在整个应用程序中使用一致的格式,而无需在各处重复文本模式。它还具有时区意识。
我一直在使用 Spring Boot 和 Jackson-databind 2.5.2 将 Joda DateTime 从 java 序列化和反序列化为 json 并再次序列化和反序列化时遇到问题。我的 pom.xml 看起来像这样。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
当我序列化 DateTime 对象时,我得到一个表示 DateTime 的整数。实际上不是我所期望的,但是很好。但是当我去保存我的对象时,我收到以下错误...
Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'endTime';
nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type org.joda.time.DateTime for value '1428600998511'
出于某种原因,它将它序列化为一个整数,然后将其反序列化为一个字符串,但事实并非如此。我还尝试在调用其余服务之前设置 endTime = new Date(intValue) 并且尝试将 'Tue Apr 28 2015 00:00:00 GMT-0700 (PDT)' 之类的字符串转换为 DateTime.
也失败了我做错了什么?
更新:
这是我得到的 JSON 和 我试图立即 POST 马上返回。
{
id: 4,
username: "",
name: "eau",
email: "aoue",
verbatimLocation: null,
latitude: null,
longitude: null,
startTime:null,
endTime: 1429034332312,
description: "ueoa",
media: [ ],
timeSubmitted: 1428600998000,
status: null,
submissionid: null
}
最后我能够按照beerbajay所说的去做并使用...
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss.SSSZ")
... 序列化我的约会对象。不过,我最终还是回到了使用 Long 而不是 DateTime,因为处理 javascript 端的日期太麻烦了。事实证明,要找到适用于 jquery datepicker、joda DateTime 和 postgresql 的模式,对于我仅有的一点时间来说,工作量太大了。
为了更可重用的机制,您可以创建一个 JsonSerializer
:
/**
* When passing JSON around, it's good to use a standard text representation of
* the date, rather than the full details of a Joda DateTime object. Therefore,
* this will serialize the value to the ISO-8601 standard:
* <pre>yyyy-MM-dd'T'HH:mm:ss.SSSZ</pre>
* This can then be parsed by a JavaScript library such as moment.js.
*/
public class JsonJodaDateTimeSerializer extends JsonSerializer<DateTime> {
private static DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
@Override
public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeString(formatter.print(value));
}
}
然后您可以使用以下方式注释您的 get
方法:
@JsonSerialize(using = JsonJodaDateTimeSerializer.class)
这使您可以在整个应用程序中使用一致的格式,而无需在各处重复文本模式。它还具有时区意识。