Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Существует ли стандартная реализация сериализатора GSON Joda Time?

Автор вопроса: Greg KopffОтветов: 6

Я использую GSON для сериализации некоторых графов объектов в JSON. Эти графики объектов используют объекты Joda Time (DateTime, LocalTime и т. д.).

Вот эта страница, которую чаще всего выдает Google по запросу "gson joda":

Он предоставляет исходный код для адаптера типа для org.joda.time.DateTime. Эта ссылка также упоминается в Руководстве пользователя GSON.

Я ожидал найти предварительно свернутую библиотеку, включающую сериализаторы joda-time, на которые я мог бы сослаться как на зависимость от Maven, но я не могу ее найти.

Есть ли один? Или я вынужден копировать этот фрагмент в своем собственном проекте?

javagsonjodatime

Ответы

Ответ 1 · рейтинг 39 · Greg Kopff

Я решил выкатить свой собственный с открытым исходным кодом - вы можете найти его здесь:

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

Вот подробности Maven (проверьте последнюю версию в центре):

<dependency>
  <groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId>
  <artifactId>gson-jodatime-serialisers</artifactId>
  <version>1.6.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 · рейтинг 14 · Ilya

Я использую следующий в своем проекте

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 · рейтинг 14 · Tao-Nhan Nguyen

Я использовал ответы выше, чтобы сделать небольшой помощник, который будет обрабатывать как сериализацию, так и десериализацию для объектов модели, содержащих переменные 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;
}

Ответ 4 · рейтинг 11 · Julien

зарегистрируйте 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"}));
    }
}

Ответ 5 · Samuel EUSTACHI

Мне кажется вполне нормальным, что у вас нет такой библиотеки.

На первый взгляд это может показаться простым, но есть риск, что вы получите множество зависимостей (некоторые во время компиляции, некоторые во время выполнения), и будет непросто убедиться, что вы не создаете нежелательных зависимостей.

В вашем случае это должно быть нормально, так как я думаю, что это только зависимость времени выполнения (тогда проект, использующий serializerLib, не должен нуждаться в JODA lib, если JODA не используется). Но для какого-то другого случая это может стать уродливым.

Ответ 6 · NimChimpsky

повторить этот фрагмент, многие люди используют другое форматирование строки даты, что сбивает с толку любое создание библиотеки.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы