首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring Boot -如何为“java.time.LocalDateTime”类创建自定义序列化

Spring Boot -如何为“java.time.LocalDateTime”类创建自定义序列化
EN

Stack Overflow用户
提问于 2018-07-29 00:46:44
回答 3查看 3.6K关注 0票数 2

我已经用Spring Boot开发了一个rest服务。我想返回一个以毫秒为单位的用户生日的json响应。如何将java.time.LocalDateTime对象序列化到毫秒?

我的模型类:

代码语言:javascript
复制
    @Entity(name = "users")
    public class User implements Serializable {

        @Id
        @GeneratedValue
        @Column(name = "user_id")
        private Long id;

        @Column(name = "first_name")
        private String firstName;

        @Column(name = "last_name")
        private String lastName;



        @Column(name = "date_of_birth")
        private LocalDateTime dateOfBirth;  

 . . .

    }

当前响应:

代码语言:javascript
复制
{
 . . .
"dateOfBirth":[2018,7,25,7,0],
. . . 
}

首选响应:

代码语言:javascript
复制
{
 . . .
"dateOfBirth": 1532786354419,
. . . 
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-29 00:51:00

使用@JsonSerialize(using = CustomSerializer.class)

代码语言:javascript
复制
@Entity(name = "users")
public class User implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Long id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;


    @JsonSerialize(using = CustomSerializer.class)
    @Column(name = "date_of_birth")
    private LocalDateTime dateOfBirth;  

    . . .

}

自定义serilizer类:

代码语言:javascript
复制
public class CustomSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    //add your custom date parser
    gen.writeString(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()+"");
}
}
票数 4
EN

Stack Overflow用户

发布于 2018-07-29 03:50:28

如果不想用@JsonSerialize修饰所有对象,可以将对象映射器配置为总是为LocalDateTime返回一个long。

代码语言:javascript
复制
@Bean
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateSerializer());
    javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateDeserializer());
    objectMapper.registerModule(javaTimeModule);
    return objectMapper;
}

和反序列化程序。

代码语言:javascript
复制
public class LocalDateSerializer extends JsonSerializer<LocalDateTime> {
    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString(String.valueOf(value.atZone(ZoneId.systemDefault()).toEpochSecond()));
    }
}

public class LocalDateDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.ofInstant(Instant.ofEpochSecond(Long.parseLong(p.getValueAsString())), ZoneId.systemDefault());
    }
}

在您的示例中,您使用了date of birth,它可以是一个LocalDate

票数 3
EN

Stack Overflow用户

发布于 2018-07-29 01:01:45

为什么不像下面这样存储date属性:

代码语言:javascript
复制
@Temporal(TemporalType.TIMESTAMP)
private Date date = new Date();

它以毫秒为单位给出日期。将其格式化为所需的输出是应用层的责任。不要在带有注释的实体本身上这样做。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51573346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档