티스토리 뷰

들어가며

  • Gson을 사용하여 ZonedDateTime 객체를 Serialize/Deserialize 하는 경우가 있다.

    public void test() {
        String json = new GsonBuilder().create().toJson(ZonedDateTime.now());
        ZonedDateTime dateTime = new GsonBuilder().create().fromJson(json, ZonedDateTime.class);
    }
  • 위와 같이 기본 세팅으로 실행할 경우 오류가 발생한다.

    • java.lang.RuntimeException: Failed to invoke java.time.ZoneId() with no args
  • 이에 대한 해결방법을 공유하고자 한다.

 

 

※Gson 사용법은 아래 이전 글을 참고해주세요.

 

[Java] Gson 라이브러리 적용 및 기본 사용법

이번 시간에는 Gson 라이브러리를 적용해보고 간단하게 사용해보는 방법에 대해서 알아보겠습니다. Gson이란? Gson의 정의는 아래와 같습니다. Gson(구글 Gson, Google Gson)은 JSON의 자바 오브젝트의 직렬화, 역..

jinseongsoft.tistory.com


해결방법

  • ZonedDateTime의 Serializer/Deserializer를 별도로 만들어줘야 한다.

    public class ZonedDateTimeTypeAdaptor implements JsonSerializer<ZonedDateTime>, JsonDeserializer<ZonedDateTime> {
    
      @Override
      public ZonedDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
          throws JsonParseException {
        try {
          final String dateTimeString = json.getAsString();
          return ZonedDateTime.parse(dateTimeString);
        } catch (Exception e) {
          throw new JsonParseException("Failed to new instance", e);
        }
      }
    
      @Override
      public JsonElement serialize(ZonedDateTime src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.format(DateTimeFormatter.ISO_INSTANT));
      }
    }
  • 이후 GsonBuilder를 생성할 때 만들었던 Serializer/Deserializer를 TypeAdapter로 등록해줘야 한다.

    private static GsonBuilder getGsonBuilder() {
        final GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(ZonedDateTime.class, new ZonedDateTimeTypeAdaptor());
        return builder;
    }

끝으로

이 글이 도움이 되었다면, Google 광고 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다!

반응형
댓글