2016-02-15 36 views
0

我有一个名为“Clerk”的具体类,它实现了一个名为“Worker”的接口。我想反序列化我的秘书对象,并将其存储到一个工人对象,就像我们通常可以做,如果我有这样的:将具体类型的对象反序列化为接口类型

Worker clerkWorker = new Clerk("abc", "alice white"); 

只有而是我有,我想反序列化,并存储到clerkWorker店员JSON:

{ 
    "uid": "1a-2wq" 
    "name": "Maryanne Chen" 
} 

接口:

public interface Worker { 
    int getUID(); 
    String getName(); 
    void work(); 
} 

类实现它:

private class Clerk implements Worker { 
    int uid; 
    String name; 

    public Clerk(id, fullname) { 
    uid = id; 
    name = fullname; 
    } 

    public void work() { 
    System.out.println("Clerk is processing files"); 
    } 
} 

按照这里介绍的第二个解决方案:Using Gson with Interface Types我复制RuntimeTypeAdapterFactory本地使用它:

RuntimeTypeAdapterFactory typeFactory =  
RuntimeTypeAdapterFactory.of(Worker.class, "type"); 
typeFactory.registerSubtype(Clerk.class); 
Gson gson = new GsonBuilder().registerTypeAdapterFactory(typeFactory).create(); 

final Reader r = getReader(jsonFile); 
return gson.fromJson(r, typeToken.getType()); 

我已经验证了我的getReader功能正在工作。我收到一个异常:

“无法反序列化接口Worker,因为它没有定义名为type的字段”。

+0

你是什么'json'好像? – njzk2

回答

0

如果ClerkWorker,那么不应该有任何理由不能完全按照您已经用构造函数示例展示的内容。

Worker w = (new Gson()).fromJson(jsonData, Clerk.class) ; 

我不知道为什么你要那么多像这样向上投向右走,因为任何想要一个Worker应该能够采取直接Clerk ...

0

当你告诉Gson反序列化一个接口类型的东西时,它必须找出它应该使用哪个实现类。它通过检查json数据中的特殊字段来实现这一点。当你打电话给RuntimeTypeAdapterFactory.of(Worker.class, "type");时,你告诉Gson它应该检查的字段以确定它应该使用哪个类名为“type”。当你给它一个没有该字段的json数据时,它会抱怨。

要解决这个问题,您需要将“type”字段添加到您的json数据中,或者在代码中将Gson反序列化为Clerk而不是Worker

+0

我向Clerk.java中添加了私有字符串类型,并在json“type”中添加了:“Clerk”,同样的错误 – Marc

+0

@Marc请改用完全限定名称(“your.package.here.Clerk”)。我必须仔细查看文档,但这是我对默认预期的猜测。 – Douglas

+0

不,你不应该需要这个,不是用户名也不是。我只想反序列化Clerk类型的json并将其存储在Worker类型中。 – Marc

相关问题