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();
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
'programing' 카테고리의 다른 글
Java에 임시 필드가 있는 이유는 무엇입니까? (0) | 2022.08.16 |
---|---|
vue composition api는 이름 경합을 어떻게 해결합니까? (0) | 2022.08.16 |
유닛 테스트 작성 방법 (0) | 2022.08.16 |
char *(char 배열)의 실제 길이와 전체 길이를 얻는 방법 (0) | 2022.08.16 |
Java에서 int에서 Long으로 변환하려면 어떻게 해야 하나요? (0) | 2022.08.12 |