반응형
Java 8 LocalDateTime을 Gson을 사용하여 역직렬화
"2014-03-10T18:46:40.000Z" 형식의 date-time 속성을 가진 JSON을 가지고 있으며, 이를 java.time으로 역직렬화하고자 합니다.Gson을 사용하는 LocalDateTime 필드.
역직렬화하려고 하면 다음 오류가 나타납니다.
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
이 오류는 LocalDateTime Atribute를 역직렬화할 때 발생합니다.이는 GSON이 LocalDateTime 개체를 인식하지 않기 때문에 Atribute 값을 해석할 수 없기 때문입니다.
Gson Builder의 레지스터 사용Adapter 메서드를 입력하여 사용자 지정 LocalDateTime 어댑터를 정의합니다.다음 코드 스니펫은 LocalDateTime 속성을 역직렬화하는 데 도움이 됩니다.
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
Instant instant = Instant.ofEpochMilli(json.getAsJsonPrimitive().getAsLong());
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
}).create();
@Randula의 응답을 확장하려면 존화된 날짜 시간 문자열(2014-03-10T18:46:40.000Z)을 JSON으로 해석해야 합니다.
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
return ZonedDateTime.parse(json.getAsJsonPrimitive().getAsString()).toLocalDateTime();
}
}).create();
@Evers의 답변을 더욱 확장하려면:
람다를 사용하면 다음과 같이 단순화할 수 있습니다.
GSON GSON = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) ->
ZonedDateTime.parse(json.getAsJsonPrimitive().getAsString()).toLocalDateTime()).create();
팔로잉은 나에게 효과가 있었다.
자바:
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return LocalDateTime.parse(json.getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); }
}).create();
Test test = gson.fromJson(stringJson, Test.class);
여기서 stringJson은 문자열 유형으로 저장된 Json입니다.
Json:
"날짜 필드":2020-01-30 15:00
여기서 dateField는 stringJson String 변수에 존재하는 LocalDateTime 유형입니다.
언급URL : https://stackoverflow.com/questions/22310143/java-8-localdatetime-deserialized-using-gson
반응형
'programing' 카테고리의 다른 글
로드 시 Angularjs 체크박스가 기본적으로 켜져 있으며 이 체크박스를 켜면 목록 선택을 비활성화합니다. (0) | 2023.04.06 |
---|---|
JSON에 날짜/시간을 저장하는 가장 좋은 방법은 무엇입니까? (0) | 2023.04.06 |
스프링 부츠에서 항아리와 전쟁의 차이점? (0) | 2023.04.06 |
반응 전달 소품(하나 제외) (0) | 2023.04.06 |
플러그인 없이 체크아웃 완료 전에 이미지를 업로드 할 수 있는 방법이 있나요? (0) | 2023.04.06 |