2016-08-02 326 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中设置字段。这不是在这里问的。 –