UserRequest我有遺留資料作為模型的一部分進入我的 API,例如
@PostMapping
public MyResponse saveUser(@Valid @RequestBody UserRequest userRequest) {
...
}
UserRequest 類使用 OffsetDateTime 作為dateRegistered欄位:
public class UserRequest {
...
OffsetDateTime birthDate;
...
}
dateRegistered我遇到的問題是資料使用以下欄位格式進入 API :
{
"last-name":"Mikel",
"birth-date":"20200716"
}
因此,來自 JSON 請求的字串表示“20200716”需要以某種方式轉換為 OffsetDateTime,如“2020-07-16T00:00:00Z”(時間部分和偏移量設定為 0s)。
默認情況下,“ 20200716 ”:
{
"last-name":"Mikel",
"birth-date":"20200716"
}
, 轉換OffsetDateTime為
{
"last-name": "Mikel",
"birth-date": "1970-08-22T19:18:36Z"
}
,這顯然是遙不可及的。
如何將 Json 欄位中日期的字串表示形式(如“ 20200716 ”)轉換為OffsetDateTime“ 2020-07-16T00:00:00Z ”或“ 2020-07-16T00:00:00.000 00:00 ”等表示形式?
我試圖用注釋我的OffsetDateTime欄位,@JsonFormat("yyyyMMdd")但這會引發例外,例如:JSON parse error: Cannot deserialize value of type java.time.OffsetDateTimefrom String "20200716"。
uj5u.com熱心網友回復:
您不需要 JSON 注釋。您需要按如下方式調整設定器。
public class MedicalCandidateRequest {
private OffsetDateTime dateRegistered;
public OffsetDateTime getDateRegistered() {
return dateRegistered;
}
public void setDateRegistered(String dateString) {
final String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSxx";
DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern(pattern);
this.dateRegistered = OffsetDateTime.parse(dateString, dtFormatter );
}
}
uj5u.com熱心網友回復:
將 setter 方法的引數更改為 String 并自己進行轉換。
public void setDateRegistered(String value) {
this.dateRegistered = doConversionHere(value);
}
uj5u.com熱心網友回復:
感謝您的建議,但我決定采用自己的實施方式。
我提供了一個自定義反序列化器,例如:
public class CustomDateDeserializer extends JsonDeserializer<OffsetDateTime> {
private static final String PATTERN = "yyyyMMdd";
private final DateTimeFormatter formatter;
public CustomDateDeserializer() {
this.formatter = DateTimeFormatter.ofPattern(PATTERN);
}
@Override
public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException, JacksonException {
LocalDate localDate = LocalDate.parse(parser.getText), formatter);
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDate, LocalTime.MIDNIGHT, ZoneOffset.UTC);
return offsetDateTime;
}
}
,然后我用它來注釋我的模型欄位,例如:
@JsonDeserialize(using = CustomDateDeserializer.class)
private OffsetDateTime birthDate;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490940.html
