web-dev-qa-db-fra.com

Existe-t-il une implémentation standard pour un sérialiseur GSON Joda Time?

J'utilise GSON pour sérialiser certains graphes d'objets en JSON. Ces graphes d'objets utilisent Joda Time entités (DateTime, LocalTime etc).

Le meilleur hit de Google pour "gson joda" est cette page:

Il fournit la source d'un adaptateur de type pour org.joda.time.DateTime. Ce lien est également celui référencé dans le GSON User Guide .

Je m'attendais à trouver une bibliothèque pré-roulée qui comprenait des serialiseurs joda-time que je pourrais référencer comme une dépendance Maven - mais je n'en trouve pas.

Est-ce qu'il y a un? Ou suis-je obligé de reproduire cet extrait dans mon propre projet?

36
Greg Kopff

J'ai décidé de lancer mon propre open source - vous pouvez le trouver ici:

https://github.com/gkopff/gson-jodatime-serialisers

Voici les détails de Maven (consultez la centrale pour la dernière version):

<dependency>
  <groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId>
  <artifactId>gson-jodatime-serialisers</artifactId>
  <version>1.6.0</version>
</dependency>

Et voici un exemple rapide de la façon dont vous le conduisez:

Gson gson = Converters.registerDateTime(new GsonBuilder()).create();
SomeContainerObject original = new SomeContainerObject(new DateTime());

String json = gson.toJson(original);
SomeContainerObject reconstituted = gson.fromJson(json, SomeContainerObject.class);
37
Greg Kopff

J'utilise ensuite dans mon projet

public final class DateTimeDeserializer implements JsonDeserializer<DateTime>, JsonSerializer<DateTime>
{
   static final org.joda.time.format.DateTimeFormatter DATE_TIME_FORMATTER =
      ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC);

   @Override
   public DateTime deserialize(final JsonElement je, final Type type,
                           final JsonDeserializationContext jdc) throws JsonParseException
   {
      return je.getAsString().length() == 0 ? null : DATE_TIME_FORMATTER.parseDateTime(dateAsString);
   }

   @Override
   public JsonElement serialize(final DateTime src, final Type typeOfSrc,
                                final JsonSerializationContext context)
   {
      return new JsonPrimitive(src == null ? StringUtils.EMPTY :DATE_TIME_FORMATTER.print(src)); 
   }
}
14
Ilya

J'ai utilisé les réponses ci-dessus pour faire un petit assistant qui gérera à la fois la sérialisation et la désérialisation pour les objets de modèle contenant des variables DateTime.

    public static Gson gsonDateTime() {
    Gson gson = new GsonBuilder()
            .registerTypeAdapter(DateTime.class, new JsonSerializer<DateTime>() {
                @Override
                public JsonElement serialize(DateTime json, Type typeOfSrc, JsonSerializationContext context) {
                    return new JsonPrimitive(ISODateTimeFormat.dateTime().print(json));
                }
            })
            .registerTypeAdapter(DateTime.class, new JsonDeserializer<DateTime>() {
                @Override
                public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
                    DateTime dt = ISODateTimeFormat.dateTime().parseDateTime(json.getAsString());
                    return dt;
                }
            })
            .create();
    return gson;
}
12
Tao-Nhan Nguyen

enregistrer un TypeAdapter auprès de GSON pour encapsuler l'utilisation d'un formateur préconfiguré Joda, voir http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html

import Java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import Java.lang.reflect.Type;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;

public class JodaDateTimeWithGson {

    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
            .registerTypeAdapter(DateTime.class, new JsonSerializer<DateTime>(){
                @Override
                public JsonElement serialize(DateTime json, Type typeOfSrc, JsonSerializationContext context) {
                    return new JsonPrimitive(ISODateTimeFormat.dateTime().print(json));
                }
            })
            .create()
            ;

        // Outputs ["20160222T15:58:33.218Z",42,"String"]
        System.out.println(gson.toJson(new Object[] {DateTime.now(), 42, "String"}));
    }
}
11
Julien

Il me semble tout à fait normal que vous ne disposiez pas de ce type de bibliothèque.

Cela peut sembler simple à première vue, mais le risque est que vous vous retrouviez avec beaucoup de dépendances (certaines au moment de la compilation, d'autres au moment de l'exécution), et il ne serait pas facile de vous assurer que vous ne créez pas de dépendances indésirables.

Pour votre cas, cela devrait être correct, car je pense que ce n'est qu'une dépendance d'exécution (Ensuite, un projet utilisant le serializerLib ne devrait pas avoir besoin de la bibliothèque JODA si JODA n'est pas utilisé). Mais pour un autre cas, cela pourrait devenir moche.

0
Samuel EUSTACHI

répliquer cet extrait, beaucoup de gens utilisent un formatage de chaîne de date différent, ce qui déroute toute création de bibliothèque.

0
NimChimpsky