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?
J'ai décidé de lancer mon propre open source - vous pouvez le trouver ici:
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);
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));
}
}
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;
}
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"}));
}
}
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.
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.