web-dev-qa-db-fra.com

GSON - Format de date

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 :(

166
Stéphane Piette

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();
284
M.L.
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'

62
tj-recess

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.

5
Milanka

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();
4
Karthik

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.

0
Marcono1234

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();
0
Abhijit Chakra