2013-02-21 51 views
30

我使用GSON將一些對象圖形序列化爲JSON。這些對象圖形使用Joda Time實體(DateTime,LocalTime等)。GSON Joda Time串行器是否有標準實現?

頂部谷歌命中 「GSON喬達」 是此頁:

它提供源爲org.joda.time.DateTime一個類型的適配器。此鏈接也是GSON User Guide中引用的內容。

我期望找到一個預先推出的庫,其中包括可以引用爲Maven依賴項的joda時間序列化程序 - 但我找不到一個。

有沒有?還是我不得不在我自己的項目中複製該片段?

回答

30

我決定推出自己的開放源碼的一個 - 你可以在這裏找到:

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); 
+3

還有一個適用於Java 8的'java.time'類:https://github.com/gkopff/gson-javatime-serialisers – 2014-04-15 00:22:25

+0

拯救生命!謝謝。 – 2015-04-12 03:10:04

+0

@GregKopff感謝您與官方圖書館的作者交談。你的庫缺少'PeriodConverter'。我試圖實現一個,但失敗。 (因爲我不太瞭解,只是基於你的代碼)。我的問題在這裏:'http:// stackoverflow.com/questions/33219587/gson-jodatime-serialisers-library-implement -deterconverter-for-period-in-joda'請訪問並給我評論。謝謝:) – hqt 2015-10-20 13:43:15

1

在我看來很正常,你沒有這種庫可用。

它乍一看可能看起來很簡單,但風險在於最終會產生很多依賴關係(一些在編譯時,一些在運行時),並且確保不創建它們並不容易不需要的依賴關係。

對於你的情況,這應該是好的,因爲我認爲這只是一個運行時依賴(如果沒有使用JODA,那麼使用serializerLib的項目不應該需要JODA lib)。但對於其他情況,這可能會變得很難看。

+1

我會喜歡'gson-jodatime-converter'庫,爲各種喬達時間實體提供GSON串行器。這不會有失控的依賴 - 它只有兩個:GSON(我已經使用)和Joda Time(我已經使用)。 – 2013-02-21 11:49:58

+0

我明白了,那麼你最終會得到很多依賴,但是卻採用了非常模塊化的方法。這可能會奏效,但我猜想它並不存在,因爲沒有人認爲維護一小組類的開源項目是有意義的 – 2013-02-21 12:25:44

+0

*我決定維護一小羣類(併發布結果Maven中心)。請看這裏:http://stackoverflow.com/a/22554290/1212960 – 2014-03-30 02:12:01

0

複製該片段,很多人使用不同的日期字符串格式,從而混淆了任何庫創建。

+0

包使用ISO 8601很簡單,它不需要與其他東西(首先)互操作 - 它只是需要能夠對數據本身進行往返。 – 2013-02-21 11:52:37

+0

是的,這是你的需要(也是我的),但有些項目使用JSON與異構環境進行通信(爲此,我嘗試使用SOAP,而不是使用WSDL進行自我記錄),因此lib應該需要高級別的「可配置性「成爲標準 – 2013-02-21 12:23:48

13

我使用的下一個在我的項目

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)); 
    } 
} 
+0

嗨,你能提供進口嗎?我找到大約20個Type類 – MartinL 2013-05-03 20:32:11

+0

@MartinL使用GSON'庫(https://code.google.com/p/google-gson/)。 'Type'是來自java-reflection API的類:'java.lang.reflect.Type' – Ilya 2013-05-03 21:36:16

+0

我試圖把它添加到我的日期時間解串器中,並且我的應用程序仍然崩潰....因爲無法讀取日期時間對象 什麼去做 ? – 2013-08-14 13:09:11

10

註冊GSON一個TypeAdapter包裝使用喬達預先格式化,見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"})); 
    } 
} 
+0

真棒,爲我完美工作...謝謝 (也與作爲一些變量DateTime的對象工作) – 2016-02-24 21:23:27

2

我用上面的答案做一個小幫手,將處理序列化和反序列化的模型包含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; 
}