J'essaie d'avoir un format de date personnalisé dans la sortie Gson, mais .setDateFormat(DateFormat.FULL)
ne semble pas fonctionner et c'est la même chose 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 cela?
Merci
ÉDITER:
@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 :(
Réponses:
Il semble que vous deviez définir des formats pour la partie date et heure ou utiliser un formatage basé sur une chaîne. Par exemple:
ou en utilisant java.text.DateFormat
ou faites-le avec des sérialiseurs:
Je crois que les formateurs ne peuvent pas produire d'horodatages, mais cette paire sérialiseur / désérialiseur semble fonctionner
Si vous utilisez Java 8 ou supérieur, vous devez utiliser les sérialiseurs / désérialiseurs ci-dessus comme suit:
la source
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
fonctionne.Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
fonctionneLe format ci-dessus me semble meilleur car il a une précision allant jusqu'à millis.
la source
Comme ML l'a souligné, JsonSerializer fonctionne ici. Cependant, 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.
Ce rapport de bogue peut être lié: http://code.google.com/p/google-gson/issues/detail?id=230 . J'utilise la version 1.7.2 cependant.
la source
Si vous détestez les classes Inner, en tirant parti de l'interface fonctionnelle, vous pouvez écrire moins de code en Java 8 avec une expression lambda.
la source
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
Cela ne fonctionnera pas vraiment du tout. Il n'y a pas de type de date dans JSON. Je recommanderais de sérialiser vers ISO8601 dans les deux sens (pour les formats indépendants et la compatibilité JS). Considérez que vous devez savoir quels champs contiennent des dates.
la source
Vous pouvez spécifier votre format
Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
dans cette méthode au lieu d'yyyy-MM-dd
utiliser d'autres formatsla source
Ceci est un bug . Actuellement, vous devez également définir un
timeStyle
ou utiliser l'une des alternatives décrites dans les autres réponses.la source
Je suis sur Gson 2.8.6 et j'ai découvert ce bogue aujourd'hui.
Mon approche permet à tous nos clients existants (mobile / web / etc) de continuer à fonctionner comme ils l'étaient, mais ajoute une certaine manipulation pour ceux qui utilisent des formats 24h et autorise aussi des millis, pour faire bonne mesure.
J'ai gardé la même sérialisation car tous les clients comprennent le format de date json standard.
Normalement, je ne pense pas que ce soit une bonne pratique d'utiliser des blocs try / catch, mais cela devrait être un cas assez rare.
la source