首页 文章

用Jackson和Spring序列化Joda DateTime

提问于
浏览
5

我一直遇到问题,一直使用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)'的字符串也失败了 .

我究竟做错了什么?

UPDATE:

这是我试图立即POST回来的JSON .

{
    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
}

2 回答

  • 2

    对于更可重用的机制,您可以创建 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)
    

    这样可以在整个应用程序中为您提供一致的格式,而无需在任这也是时区意识 .

  • 8

    最后我能够做beerbajay说并使用......

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

    ...序列化我的约会 . 但是,我做了,最后回到使用Long而不是DateTime,因为在javascript端处理日期太麻烦了 . 找到一个适用于jquery datepicker,joda DateTime和postgresql的模式,证明了我的工作时间太长了 .

相关问题