Jackson은 ISO8601 형식의 날짜 시간을 Java8 Instant로 역직렬화
ISO8601 형식의 날짜를 Java8로 역직렬화하려고 합니다.java.time.Instant
잭슨을 이용해서.ObjectMapper에 JavaTimeModule을 등록하여WRITE_DATES_AS_TIMESTAMPS
설정.
단, 디시리얼라이즈를 시도하면2016-03-28T19:00:00.000+01:00
Java Time Module은 UTC 시간대 오프셋으로 포맷된 날짜 시간만 역직렬화하기 때문에 작동하지 않습니다(예:2016-03-28T18:00:00.000Z
)를 사용해 보았습니다.@JsonFormat
주석:
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "UTC")
그리고 이렇게.
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = JsonFormat.DEFAULT_TIMEZONE)
그러나 둘 다 작동하지 않으며 예외는 없습니다.
com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])
즉, 시간대 매개 변수는 무시되고 날짜 시간 포맷은 시간대가 없는 Instant 형식을 알 수 없습니다.
UTC 시간대 오프셋에 포함되지 않은 ISO8601 문자열을 Java 8로 역직렬화하는 방법이 있습니까?java.time.Instant
커스텀 디시리얼라이저를 작성하지 않고 잭슨과 Java Time Module을 사용하는 경우
를 사용하여 명시적 시간대를 설정해야 합니다.XXX
modell 클래스:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
(https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) 참조).
연재를 원하는 경우Date
ISO-8601로 객체를 변환하면 패턴을 지정할 필요가 없습니다. ISO-8601이 기본 패턴입니다.Java 문서에는 다음과 같은 내용이 기재되어 있습니다.
일반적인 용도에는 대체 표현(예를 들어 Date를 숫자로 시리얼화할지(Java 타임스탬프) 또는 문자열(ISO-8601 호환 시간 값 등) 중 하나)을 선택하고 pattern() 속성을 사용하여 정확한 세부 정보를 설정하는 것이 포함됩니다.
위의 텍스트에서 특정하는 것을 이해해야 합니다.shape = STRING
ISO-8601 포맷을 의미합니다만,pattern
소유물.
제 경험상, 이것은 항상 UTC 날짜 포맷으로 나타납니다(타임존은 다음과 같습니다).+0000
(운영체제클럭이 UTC로 설정되어 있지 않은 경우에도 VM의 디폴트 타임존이 될 수 있습니다).
Jackson 2.9.8(현재는 쓰고 있습니다)에서는 Date 대신 Instant를 사용하는 것이 좋습니다.
종속성을 추가해야 합니다.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9.8</version>
</dependency>
또한 모듈을 등록하고 Serialization Feature를 설정합니다.WRITE_DATS_AS_TIMESTAMPS가 false가 됩니다.
new ObjectMapper()
.findAndRegisterModules()
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Java8용 잭슨에 대한 자세한 내용은 https://github.com/FasterXML/jackson-modules-java8를 참조하십시오.
Jackson은 콜론의 유무에 관계없이 타임스탬프를 받아들이도록 글로벌하게(주석 없이) 설정할 수 있습니다.
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true));
기본 잭슨 시간대 형식은 버전 2.11 이후 '+0000'에서 '+00:00'로 변경되었습니다.ISO-8601에 따라 두 형식 모두 유효합니다.
"+01:00"에서는 다른 패턴이기 때문에 "Z" 형식은 작동하지 않습니다.JsonFormat이 SimpleDateFormat 패턴을 사용하고 있습니다.대문자 'Z'는 엄밀한 RFC 822만을 나타냅니다.콜론을 사용하지 않고 "+0100"과 같은 구문을 사용해야 합니다.
참조: ISO 8601:2004, SimpleDateFormat 패턴
언급URL : https://stackoverflow.com/questions/36252556/jackson-deserialize-iso8601-formatted-date-time-into-java8-instant
'programing' 카테고리의 다른 글
중첩된 Grails 도메인 개체에 대한 JSON 바인딩 (0) | 2023.04.02 |
---|---|
PHP - 기존 함수 재정의 (0) | 2023.04.02 |
Javascript/Typescript에서 어레이 복제 (0) | 2023.04.02 |
Gradle을 사용한 Spring Boot Multi Module 프로젝트는 구축되지 않음 (0) | 2023.04.02 |
반응: 부모 구성 요소가 다시 렌더링될 때 어린이가 항상 다시 렌더링합니까? (0) | 2023.03.28 |