java - examples - ¿Hay una implementación estándar para un serializador GSON Joda Time?
jodatime datetime format examples (6)
Estoy usando GSON para serializar algunos gráficos de objetos a JSON. Estos gráficos de objetos usan entidades Joda Time ( DateTime
, LocalTime
, etc.).
El principal éxito de Google para "gson joda" es esta página:
Proporciona una fuente para un adaptador de tipo para org.joda.time.DateTime
. Este enlace es también lo que se menciona en la Guía del usuario de GSON .
Esperaba encontrar una biblioteca previamente enrollada que incluyera serializadores de tiempo joda a los que pudiera hacer referencia como una dependencia de Maven, pero no puedo encontrar ninguno.
¿Hay alguno? ¿O estoy obligado a replicar ese fragmento en mi propio proyecto?
Estoy usando el siguiente en mi proyecto
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));
}
}
He decidido lanzar mi propio código abierto, puedes encontrarlo aquí:
Aquí están los detalles de Maven (verifique central para la última versión):
<dependency>
<groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId>
<artifactId>gson-jodatime-serialisers</artifactId>
<version>1.6.0</version>
</dependency>
Y aquí hay un ejemplo rápido de cómo lo conduce:
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);
Me parece bastante normal que no tenga este tipo de biblioteca disponible.
Puede parecer simple a primera vista, pero el riesgo es que termine con muchas dependencias (algunas en tiempo de compilación, otras en tiempo de ejecución), y no sería fácil asegurarse de no crear dependencias no deseadas.
Para su caso, esto debería estar bien, ya que creo que esto es solo una dependencia de tiempo de ejecución (Entonces, un proyecto que utiliza el serializadorLib no debería necesitar JODA lib si no se usa JODA). Pero para otro caso, esto podría volverse feo.
Utilicé las respuestas anteriores para hacer un pequeño ayudante que manejará tanto la serialización como la deserialización para objetos modelo que contengan 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;
}
registre un TypeAdapter con GSON para envolver el uso de un formateador preconfigurado Joda, consulte 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"}));
}
}
replicar ese fragmento, mucha gente usa un formato de cadena de fechas diferente, confundiendo así cualquier creación de la biblioteca.