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

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

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

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

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

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


person Greg Kopff    schedule 21.02.2013    source источник


Ответы (6)


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

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);
person Greg Kopff    schedule 21.03.2014
comment
Здесь также есть один для классов java.time Java 8: github.com/gkopff/gson-javatime-serialisers< /а> - person Greg Kopff; 15.04.2014
comment
Спасатель жизни! Спасибо. - person Sebastian Roth; 12.04.2015
comment
@GregKopff спасибо за разговор с автором официальной библиотеки. В вашей библиотеке отсутствует PeriodConverter. Я пытался реализовать один, но потерпел неудачу. (потому что я мало что понимаю, просто основываясь на вашем коде). Мой вопрос здесь: http://stackoverflow.com/questions/33219587/gson-jodatime-serialisers-library-implement-periodconverter-for-period-in-joda Пожалуйста, посетите и дайте мне комментарий. Спасибо :) - person hqt; 20.10.2015
comment
Добавление его в мой проект Android дает эту ошибку: Execution failed for task (..) com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: org/joda/time/base/AbstractDateTime.class - person RominaV; 22.09.2016
comment
Так легко применить .. Спасибо - person Odys; 21.10.2016
comment
Это работает, спасибо! Для импорта градиента: implementation 'com.fatboyindustrial.gson-jodatime-serialisers:gson-jodatime-serialisers:1.7.0' - person fireb86; 10.10.2018

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

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)); 
   }
}
person Ilya    schedule 21.02.2013
comment
Привет, не могли бы вы предоставить импорт? Я нахожу около 20 классов Type - person MartinL; 04.05.2013
comment
@MartinL GSON используется библиотека (code.google.com/p/google-gson). Type — это класс из API java-reflection: java.lang.reflect.Type - person Ilya; 04.05.2013
comment
я попытался добавить это в свой десериализатор даты и времени, и мое приложение все равно разбилось .... из-за того, что не смог прочитать объекты даты и времени, что делать? - person Lena Bru; 14.08.2013
comment
У меня тоже не сработало. Дата написана правильно, т. ISO 8601, но Gson задыхается, когда пытается его прочитать. - person Cheezmeister; 31.10.2013
comment
@Cheezmeister, ты получил исключение? - person Ilya; 31.10.2013

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

зарегистрируйте 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"}));
    }
}
person Julien    schedule 22.02.2016
comment
Круто, отлично сработало для меня... спасибо (также работает с объектами с DateTime в качестве некоторых переменных) - person Toothless Seer; 25.02.2016

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

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

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

person Samuel EUSTACHI    schedule 21.02.2013
comment
Мне бы понравилась библиотека gson-jodatime-converter, которая предоставляет сериализаторы GSON для различных сущностей Joda Time. У него не будет неконтролируемых зависимостей — их всего две: GSON (которую я уже использую) и Joda Time (которую я уже использую). - person Greg Kopff; 21.02.2013
comment
Ясно, тогда у вас будет много зависимостей, но с очень модульным подходом. Это сработало бы, но я предполагаю, что его не существует, потому что никто не думал, что имеет смысл поддерживать проект с открытым исходным кодом для небольшой группы классов. - person Samuel EUSTACHI; 21.02.2013
comment
Я решил сохранить эту небольшую группу классов (и опубликовать результат в Maven Central). См. здесь: stackoverflow.com/a/22554290/1212960 - person Greg Kopff; 30.03.2014

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

person NimChimpsky    schedule 21.02.2013
comment
Для пакета было бы просто использовать ISO 8601. Он не должен быть совместим с другими вещами (в первую очередь) — он просто должен иметь возможность передавать данные туда и обратно. - person Greg Kopff; 21.02.2013
comment
Да, это ваша потребность (и моя тоже), но некоторые проекты используют JSON для связи с гетерогенными средами (для этого я пытаюсь использовать вместо этого SOAP, больше самодокументирования с помощью WSDL), поэтому библиотека должна нуждаться в высоком уровне конфигурируемости, чтобы стать стандартный - person Samuel EUSTACHI; 21.02.2013