2016-08-02 101 views
2

我有JSON包含:GSON:反序列化JSON轉換成抽象類

{"timeZone": "America/Los_Angeles"} 

許多其它密鑰中的,我想它反序列化爲java.util.TimeZoneTimeZone只是我想用此json實例化的類中的一個字段。

問題是TimeZone是一個抽象類,它應該被實例化:

public static synchronized TimeZone getTimeZone(String ID) { 
     return getTimeZone(ID, true); 

它使用一個具體的類ZoneInfo實例。然而,解串器默認調用TimeZone的構造函數。所以我就:

java.lang.RuntimeException: Failed to invoke public java.util.TimeZone() with no args 

我不知道如何配置GSON實例從上面的JSON一個TimeZone

+0

你有沒有嘗試使用像SimpleTimeZone這樣的非抽象類? – JAVAC

+0

Id冒險說這不可能。序列化器需要實例化來構建輸出值,而抽象類不能被實例化。 – Felype

+0

@JAVAC來自圖書館課程,我不能改變。 –

回答

5

你需要像GSON TypeAdapter創造的東西和你的Gson實例註冊。

我不知道如何/是否會爲您的特定數據格式的工作,但在這裏,我已經在我自己的項目使用的例子:

public class TimeZoneAdapter extends TypeAdapter<TimeZone> { 
    @Override 
    public void write(JsonWriter out, TimeZone value) throws IOException { 
    out.value(value.getID()); 
    } 

    @Override 
    public TimeZone read(JsonReader in) throws IOException { 
    return TimeZone.getTimeZone(in.nextString()); 
    } 
} 

建設時,您會然後將其註冊Gson像這樣的例子:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(TimeZone.class, new TimeZoneAdapter()); 

Gson gson = builder.create(); 

希望這有助於!

0

你必須創建InstanceCreator

private class TimeZoneInstanceCreator implements InstanceCreator<TimeZone> { 
    public TimeZone createInstance(Type type) { 
     return TimeZone.getTimeZone("America/Los_Angeles");; 
    } 
} 

,然後註冊它:

gson.registerTypeAdapter(TimeZone.class, new TimeZoneInstanceCreator()); 
+0

我不認爲我可以硬編碼'America/Los_Angeles'的價值。它應該是json傳入的值,對吧? –

+1

這是錯誤的。 'InstanceCreator'僅用於創建實例。然後Gson將按照其常規流程從JSON中設置字段。這不是在這裏問的。 –