Существует ли стандартная реализация сериализатора времени GSON Joda Time?
Я использую GSON для сериализации некоторых графиков объектов для JSON. Графы этих объектов используют объекты Joda Time (DateTime
, LocalTime
и т.д.).
Топ-хит Google для "gson joda" - это страница:
Он обеспечивает источник адаптера типа для org.joda.time.DateTime
. Эта ссылка также упоминается в Руководстве пользователя GSON.
Я ожидал найти предварительно прокатанную библиотеку, которая включала сериализаторы серии joda, которые я мог бы ссылаться как зависимость Maven, но я не могу ее найти.
Есть ли он? Или я вынужден повторить этот фрагмент в моем собственном проекте?
Ответы
Ответ 1
Я решил запустить свой собственный открытый исходный код - вы можете найти его здесь:
https://github.com/gkopff/gson-jodatime-serialisers
Здесь детали Maven (проверьте центральную для последней версии):
<dependency>
<groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId>
<artifactId>gson-jodatime-serialisers</artifactId>
<version>1.0.0</version>
</dependency>
И вот быстрый пример того, как вы его управляете:
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);
Ответ 2
Я использую следующий в своем проекте
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));
}
}
Ответ 3
зарегистрируйте TypeAdapter с помощью GSON, чтобы обернуть использование предварительно сконфигурированных форматировщиков Joda, см. 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"}));
}
}
Ответ 4
Мне кажется вполне нормальным, что у вас нет такой библиотеки.
Это может показаться простым на первый взгляд, но риск состоит в том, что вы получаете множество зависимостей (некоторые во время компиляции, некоторые во время выполнения), и было бы непросто убедиться, что вы не создаете нежелательных зависимостей.
В вашем случае это должно быть нормально, так как я думаю, что это только зависимость времени выполнения (тогда для проекта с использованием serializerLib не требуется JODA lib, если JODA не используется). Но для другого случая это может стать уродливым.
Ответ 5
Я использовал приведенные выше ответы, чтобы сделать небольшой помощник, который будет обрабатывать как сериализацию, так и десериализацию для объектов модели, содержащих переменные 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;
}
Ответ 6
реплицируйте этот фрагмент, многие люди используют другое форматирование строки даты, тем самым запутывая создание любой библиотеки.