![](/img/trans.png)
[英]Java fasterxml.jackson deserialize LocalDateTime wrongTokenException
[英]Deserialize Java 8 LocalDateTime with Jackson
在 Jackson 2.11 中,在序列化過程中更改了 LocalDataTime 格式。 我有反序列化的問題。 我找到了從 objectMapper 覆蓋配置的解決方案,如下所示:
@Configuration
public class AppConfig {
@Bean
public ObjectMapper objectMapper()
{
ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
mapper.registerModule(javaTimeModule);
return mapper;
}
但我仍然無法將 json 字符串反序列化為 java model:
@Data
public class CustomLocalDataTime {
//@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSxxx") <- not working
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS") // <- not working
// @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", shape = JsonFormat.Shape.STRING) <- not working
private LocalDateTime date;
}
所以我從格式示例中的一些響應 localdatatime 收到:2022-04-05T05:00:00.000+00:00 並且在反序列化期間我仍然收到錯誤:
com.fasterxml.jackson.databind.exc.InvalidFormatException:
Cannot deserialize value of type `java.time.LocalDateTime`
from String "2022-04-05T05:00:00.000+00:00": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2022-04-05T05:00:00.000+00:00'
could not be parsed, unparsed text found at index 23
at [Source: (String)"{"date":"2022-04-05T05:00:00.000+00:00"}"; line: 1, column: 9]
我通過這樣重現此錯誤來接收此錯誤:
@PostConstruct
public void customDeserializeTest() {
String content =
"{\"date\":\"2022-04-05T05:00:00.000+00:00\"}";
try {
CustomLocalDataTime customLocalDataTime = objectMapper.readValue(content, CustomLocalDataTime.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
我也嘗試添加: com.fasterxml.jackson.databind.annotation。
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
但這也行不通。
非常感謝您的指導。
正如其他人評論的那樣,您使用了錯誤的數據類型。
LocalDateTime
class 故意缺少任何時區或offset-from-UTC 的概念。 所以這個 class 不能代表 moment ,時間軸上的特定點。 這個 class 僅代表日期和時間,但我們不知道該日期和時間是用於日本東京、法國圖盧茲還是美國俄亥俄州托萊多。
因此LocalDateTime
class 不適合您的輸入。
字符串輸入:
2022-04-05T05:00:00.000+00:00
2022-04-05T05:00:00.000Z
…兩者都代表 UTC 中的時刻,與 UTC 的偏移量為零小時-分鍾-秒。 第二個結尾的Z
是+00:00
的標准 ISO 8601 縮寫,發音為“Zulu”。
Instant
和OffsetDateTime
您可以將此類輸入解析為Instant
對象或更靈活OffsetDateTime
對象。
這些輸入字符串使用標准ISO 8601格式。 java.time類在解析/生成時默認使用這些格式。 因此無需指定格式化模式。
Instant instant = Instant.parse( "2022-04-05T05:00:00.000+00:00" ) ;
Instant instant2 = Instant.parse( "2022-04-05T05:00:00.000Z" ) ;
OffsetDateTime odt = OffsetDateTime.parse( "2022-04-05T05:00:00.000+00:00" ) ;
OffsetDateTime odt2 = OffsetDateTime.parse( "2022-04-05T05:00:00.000Z" ) ;
instant: 2022-04-05T05:00:00Z
instant2: 2022-04-05T05:00:00Z
odt: 2022-04-05T05:00Z
odt2: 2022-04-05T05:00Z
一條評論提到使用ZonedDateTime
。 那將是不明智的。 時區的名稱采用Continent/Region
格式,例如Europe/Paris
或Pacific/Auckland
。 您的輸入只有偏移量,沒有時區。 所以ZonedDateTime
在這里會產生誤導和混淆。
偏移量僅僅是UTC本初子午線之前或之后的小時-分鍾-秒數。 時區要多得多。 時區是特定地區的人們使用的偏移量的過去、現在和未來變化的命名歷史。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.