programing

GSON - 날짜 형식

shortcode 2022. 8. 16. 21:31
반응형

GSON - 날짜 형식

Gson 출력에 커스텀 날짜 형식을 사용하려고 합니다만,.setDateFormat(DateFormat.FULL)동작하지 않는 것 같고, 또 같은 경우도 마찬가지입니다..registerTypeAdapter(Date.class, new DateSerializer()).

Gson은 "날짜"라는 물체에 신경 쓰지 않고 인쇄하는 것과 같습니다.

어떻게 하면 바꿀 수 있을까요?

고마워요.

편집:

@Entity
public class AdviceSheet {
  public Date lastModif;
[...]
}

public void method {
   Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
   System.out.println(gson.toJson(adviceSheet);
}

나는 항상 사용한다java.util.Date;setDateFormat()동작하지 않는다:(

날짜와 시간 부분의 형식을 정의하거나 문자열 기반 형식을 사용해야 합니다.예를 들어 다음과 같습니다.

Gson gson = new GsonBuilder()
   .setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();

또는 java.text를 사용합니다.날짜 형식

Gson gson = new GsonBuilder()
   .setDateFormat(DateFormat.FULL, DateFormat.FULL).create();

또는 시리얼라이저를 사용하여 수행합니다.

포메터에서는 타임스탬프를 생성할 수 없다고 생각합니다만, 이 시리얼라이저/디시리얼라이저 쌍은 동작하고 있는 것 같습니다.

JsonSerializer<Date> ser = new JsonSerializer<Date>() {
  @Override
  public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext 
             context) {
    return src == null ? null : new JsonPrimitive(src.getTime());
  }
};

JsonDeserializer<Date> deser = new JsonDeserializer<Date>() {
  @Override
  public Date deserialize(JsonElement json, Type typeOfT,
       JsonDeserializationContext context) throws JsonParseException {
    return json == null ? null : new Date(json.getAsLong());
  }
};

Gson gson = new GsonBuilder()
   .registerTypeAdapter(Date.class, ser)
   .registerTypeAdapter(Date.class, deser).create();

Java 8 이상을 사용하는 경우 위의 시리얼라이저/디시리얼라이저를 다음과 같이 사용해야 합니다.

JsonSerializer<Date> ser = (src, typeOfSrc, context) -> src == null ? null
            : new JsonPrimitive(src.getTime());

JsonDeserializer<Date> deser = (jSon, typeOfT, context) -> jSon == null ? null : new Date(jSon.getAsLong());
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();

위 포맷은 밀리까지 정밀도가 있기 때문에 더 좋은 것 같습니다.

M.L.가 지적했듯이 JsonSerializer는 여기서 일하고 있습니다.단, 데이터베이스 엔티티를 포맷하는 경우에는 java.sql을 사용합니다.시리얼라이저를 등록하는 날짜.디시리얼라이저는 필요 없습니다.

Gson gson = new GsonBuilder()
   .registerTypeAdapter(java.sql.Date.class, ser).create();

이 버그 리포트는, http://code.google.com/p/google-gson/issues/detail?id=230 와 관련하고 있을 가능성이 있습니다.버전 1.7.2를 사용합니다.

Inner 클래스를 싫어하는 경우 기능 인터페이스를 활용하면 Java 8에서 lambda 식을 사용하여 코드를 적게 쓸 수 있습니다.

JsonDeserializer<Date> dateJsonDeserializer = 
     (json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();

이것은 버그입니다.현시점에서는, 다음의 어느쪽인가를 설정할 필요가 있습니다.timeStyle또는 다른 답변에 설명된 대안 중 하나를 사용합니다.

이건 전혀 효과가 없을 거예요.JSON에는 날짜 유형이 없습니다.ISO8601에 앞뒤로 시리얼화할 것을 권장합니다(포맷 불가지론 및 JS 호환).어느 필드에 날짜가 포함되어 있는지 알아야 합니다.

포맷을 지정할 수 있습니다.Gson gson = builder.setDateFormat("yyyy-MM-dd").create();대신 이 방법으로yyyy-MM-dd다른 형식을 사용할 수 있습니다.

 GsonBuilder builder = new GsonBuilder();
                        builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
                            public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                                return new Date(json.getAsJsonPrimitive().getAsLong());
                            }
                        });

                        Gson gson = builder.setDateFormat("yyyy-MM-dd").create();

Gson 2.8.6을 사용하고 있는데 오늘 이 버그를 발견했습니다.

나의 접근방식에서는 기존의 모든 클라이언트(모바일/웹 등)가 그대로 기능할 수 있지만, 24시간 포맷을 사용하는 클라이언트에 대한 처리가 추가되어 millis도 적절히 기능할 수 있습니다.

Gson rawGson = new Gson();
SimpleDateFormat fmt = new SimpleDateFormat("MMM d, yyyy HH:mm:ss")
private class DateDeserializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            return new rawGson.fromJson(json, Date.class);
        } catch (JsonSyntaxException e) {}
        String timeString = json.getAsString();
        log.warning("Standard date deserialization didn't work:" + timeString);
        try {
            return fmt.parse(timeString);
        } catch (ParseException e) {}
        log.warning("Parsing as json 24 didn't work:" + timeString);
        return new Date(json.getAsLong());
    }
}

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateDeserializer())
    .create();

모든 고객이 표준적인 json 날짜 형식을 이해하고 있기 때문에, 저는 serialization을 동일하게 유지했습니다.

일반적으로 흐름 제어를 제어하기 위해 try/catch 블록을 사용하는 것은 좋지 않다고 생각합니다만, 이것은 매우 드문 경우입니다.

언급URL : https://stackoverflow.com/questions/6873020/gson-date-format

반응형