programing

Jackson은 ISO8601 형식의 날짜 시간을 Java8 Instant로 역직렬화

lastcode 2023. 4. 2. 10:36
반응형

Jackson은 ISO8601 형식의 날짜 시간을 Java8 Instant로 역직렬화

ISO8601 형식의 날짜를 Java8로 역직렬화하려고 합니다.java.time.Instant잭슨을 이용해서.ObjectMapper에 JavaTimeModule을 등록하여WRITE_DATES_AS_TIMESTAMPS설정.

단, 디시리얼라이즈를 시도하면2016-03-28T19:00:00.000+01:00Java 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을 사용하는 경우

를 사용하여 명시적 시간대를 설정해야 합니다.XXXmodell 클래스:

@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) 참조).

연재를 원하는 경우DateISO-8601로 객체를 변환하면 패턴을 지정할 필요가 없습니다. ISO-8601이 기본 패턴입니다.Java 문서에는 다음과 같은 내용이 기재되어 있습니다.

일반적인 용도에는 대체 표현(예를 들어 Date를 숫자로 시리얼화할지(Java 타임스탬프) 또는 문자열(ISO-8601 호환 시간 값 등) 중 하나)을 선택하고 pattern() 속성을 사용하여 정확한 세부 정보를 설정하는 것이 포함됩니다.

위의 텍스트에서 특정하는 것을 이해해야 합니다.shape = STRINGISO-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

반응형