我已经用Spring Boot开发了一个rest服务。我想返回一个以毫秒为单位的用户生日的json响应。如何将java.time.LocalDateTime
对象序列化到毫秒?
我的模型类:
@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;
. . .
}
当前响应:
{
. . .
"dateOfBirth":[2018,7,25,7,0],
. . .
}
首选响应:
{
. . .
"dateOfBirth": 1532786354419,
. . .
}
发布于 2018-07-29 00:51:00
使用@JsonSerialize(using = CustomSerializer.class)
@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类:
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()+"");
}
}
发布于 2018-07-29 03:50:28
如果不想用@JsonSerialize
修饰所有对象,可以将对象映射器配置为总是为LocalDateTime
返回一个long。
@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;
}
和反序列化程序。
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
。
发布于 2018-07-29 01:01:45
为什么不像下面这样存储date属性:
@Temporal(TemporalType.TIMESTAMP)
private Date date = new Date();
它以毫秒为单位给出日期。将其格式化为所需的输出是应用层的责任。不要在带有注释的实体本身上这样做。
https://stackoverflow.com/questions/51573346
复制相似问题