J'essaie d'avoir un format de date personnalisé dans la sortie Gson, mais .setDateFormat(DateFormat.FULL)
ne semble pas fonctionner et il en va de même avec .registerTypeAdapter(Date.class, new DateSerializer())
.
C'est comme si Gson ne se souciait pas de l'objet "Date" et l'imprimait à sa manière.
Comment puis-je changer ça?
Merci
MODIFIER:
@Entity
public class AdviceSheet {
public Date lastModif;
[...]
}
public void method {
Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
System.out.println(gson.toJson(adviceSheet);
}
J'utilise toujours Java.util.Date
; setDateFormat()
ne fonctionne pas :(
Il semble que vous deviez définir des formats pour les parties de date et d’heure ou utiliser un formatage basé sur des chaînes. Par exemple:
Gson gson = new GsonBuilder()
.setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();
ou en utilisant Java.text.DateFormat
Gson gson = new GsonBuilder()
.setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
ou le faire avec des sérialiseurs:
Je crois que les formateurs ne peuvent pas produire d'horodatage, mais cette paire sérialiseur/désérialiseur semble fonctionner
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();
Le format ci-dessus me semble meilleur car il a une précision allant jusqu’à millis.
Edité le format pour citer 'Z'
Comme M.L. a souligné, JsonSerializer fonctionne ici. Toutefois, si vous formatez des entités de base de données, utilisez Java.sql.Date pour enregistrer votre sérialiseur. Le désérialiseur n'est pas nécessaire.
Gson gson = new GsonBuilder()
.registerTypeAdapter(Java.sql.Date.class, ser).create();
Ce rapport de bogue pourrait être lié: http://code.google.com/p/google-gson/issues/detail?id=2 . J'utilise la version 1.7.2 cependant.
Au cas où vous détesteriez les classes Inner, en prenant l'avantage d'une interface fonctionnelle, vous pouvez écrire moins de code dans Java 8 avec une expression lambda.
JsonDeserializer<Date> dateJsonDeserializer =
(json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();
Ceci est un bug . Actuellement, vous devez soit définir une variable timeStyle
, soit utiliser l'une des solutions décrites dans les autres réponses.
Vous pouvez spécifier le format Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
dans cette méthode au lieu de yyyy-MM-dd
, vous pouvez utiliser tout autre format.
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();