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();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create();
上記の形式は、ミリ単位の精度を持っているので、私には良いようです。
「Z」を引用するようにフォーマットを編集しました
M.L.としてJsonSerializerがここで動作することを指摘しました。ただし、データベースエンティティをフォーマットする場合は、Java.sql.Dateを使用してシリアライザーを登録します。デシリアライザーは必要ありません。
Gson gson = new GsonBuilder()
.registerTypeAdapter(Java.sql.Date.class, ser).create();
このバグレポートは関連している可能性があります: http://code.google.com/p/google-gson/issues/detail?id=2 。ただし、バージョン1.7.2を使用します。
内部クラスが嫌いな場合は、関数型インターフェイスを利用することで、ラムダ式を使用してJava 8で記述するコードを減らすことができます。
JsonDeserializer<Date> dateJsonDeserializer =
(json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();
これは バグ です。現在、同様にtimeStyle
を設定するか、他の回答で説明されている選択肢のいずれかを使用する必要があります。
このメソッドでは、yyyy-MM-dd
の代わりにGson gson = builder.setDateFormat("yyyy-MM-dd").create();
をフォーマットするように指定できます。他のフォーマットを使用できます
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();