为什么当我将实体转换为 Json 时 LocalDate 格式发生了变化?
Why LocalDate format changed when I transform entity to Json?
我的 objective 是将日期存储到数据库中。为此,我使用了 Springboot、JPA、H2、...
我使用 LocalDate
,希望的格式是 yyyy-MM-dd
。
实体
@Entity
public class MyObject {
@Id
private String id;
private LocalDate startdate;
private LocalDate enddate;
public MyObject() {}
public MyObject(LocalDate enddate) {
this.startdate = LocalDate.now();
this.enddate = enddate;
}
...
}
主要
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
MyObject myObject = new MyObject(LocalDate.parse("2019-03-01", formatter));
myObject.setId(UUID.randomUUID().toString());
myObjectResource.save(myObject);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
System.out.println(myObject.getStartdate()); // 2019-02-23
System.out.println(myObject.getEnddate()); // 2019-03-01
HttpEntity<String> entity = new HttpEntity<>(this.toJsonString(myObject), headers);
System.out.println(entity.toString()); // <{"id":"ba6649e4-6e65-4f54-8f1a-f8fc7143b05a","startdate":{"year":2019,"month":"FEBRUARY","dayOfMonth":23,"dayOfWeek":"SATURDAY","era":"CE","dayOfYear":54,"leapYear":false,"monthValue":2,"chronology":{"id":"ISO","calendarType":"iso8601"}},"enddate":{"year":2019,"month":"MARCH","dayOfMonth":1,"dayOfWeek":"FRIDAY","era":"CE","dayOfYear":60,"leapYear":false,"monthValue":3,"chronology":{"id":"ISO","calendarType":"iso8601"}}},[Content-Type:"application/json"]>
private String toJsonString(Object o) throws Exception {
ObjectMapper om = new ObjectMapper();
return om.writeValueAsString(o);
}
你能帮我理解为什么 entity.toString()
中的日期与 getMethods()
中的日期不一样吗?
感谢帮助!
LocalDate.parse
returns 一个新的 LocalDate
对象。 DateTimeFormatter
中指定的格式选项在后面丢失。
Jackson
(您正在使用的 JSON
库)不知道您之前如何 "formatted" LocalDate
,因此它使用自己的格式。
您可以注册JavaTimeModule
final ObjectMapper om = new ObjectMapper();
om.registerModule(new JavaTimeModule());
或者您可以提供您的自定义 JsonSerializer<T>
。
我的 objective 是将日期存储到数据库中。为此,我使用了 Springboot、JPA、H2、...
我使用 LocalDate
,希望的格式是 yyyy-MM-dd
。
实体
@Entity
public class MyObject {
@Id
private String id;
private LocalDate startdate;
private LocalDate enddate;
public MyObject() {}
public MyObject(LocalDate enddate) {
this.startdate = LocalDate.now();
this.enddate = enddate;
}
...
}
主要
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
MyObject myObject = new MyObject(LocalDate.parse("2019-03-01", formatter));
myObject.setId(UUID.randomUUID().toString());
myObjectResource.save(myObject);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
System.out.println(myObject.getStartdate()); // 2019-02-23
System.out.println(myObject.getEnddate()); // 2019-03-01
HttpEntity<String> entity = new HttpEntity<>(this.toJsonString(myObject), headers);
System.out.println(entity.toString()); // <{"id":"ba6649e4-6e65-4f54-8f1a-f8fc7143b05a","startdate":{"year":2019,"month":"FEBRUARY","dayOfMonth":23,"dayOfWeek":"SATURDAY","era":"CE","dayOfYear":54,"leapYear":false,"monthValue":2,"chronology":{"id":"ISO","calendarType":"iso8601"}},"enddate":{"year":2019,"month":"MARCH","dayOfMonth":1,"dayOfWeek":"FRIDAY","era":"CE","dayOfYear":60,"leapYear":false,"monthValue":3,"chronology":{"id":"ISO","calendarType":"iso8601"}}},[Content-Type:"application/json"]>
private String toJsonString(Object o) throws Exception {
ObjectMapper om = new ObjectMapper();
return om.writeValueAsString(o);
}
你能帮我理解为什么 entity.toString()
中的日期与 getMethods()
中的日期不一样吗?
感谢帮助!
LocalDate.parse
returns 一个新的 LocalDate
对象。 DateTimeFormatter
中指定的格式选项在后面丢失。
Jackson
(您正在使用的 JSON
库)不知道您之前如何 "formatted" LocalDate
,因此它使用自己的格式。
您可以注册JavaTimeModule
final ObjectMapper om = new ObjectMapper();
om.registerModule(new JavaTimeModule());
或者您可以提供您的自定义 JsonSerializer<T>
。