我有一个名为"Clerk“的具体类,它实现了一个名为"Worker”的接口。我想反序列化我的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函数是有效的。我有个例外:
“无法反序列化接口工作者,因为它没有定义名为type的字段”。
发布于 2016-02-15 23:04:26
如果Clerk是一个Worker,那么就不应该有任何理由不能完全按照构造函数示例显示的那样做。
Worker w = (new Gson()).fromJson( jsonData, Clerk.class ) ;我不知道你为什么要这么快地往上投,因为任何想要Worker的东西都应该可以直接使用Clerk .
发布于 2016-02-15 20:25:20
当您告诉Gson用接口类型反序列化某个东西时,它必须以某种方式确定它应该使用哪个实现类。它通过检查json数据中的一个特殊字段来做到这一点。当您调用RuntimeTypeAdapterFactory.of(Worker.class, "type");时,您正在告诉Gson,它应该检查的字段应该使用哪个类来命名为"type“。然后,当您给它一个没有该字段的json数据块时,它会发出抱怨。
要解决这个问题,您需要将"type“字段添加到json数据中,或者告诉代码中的Gson反序列化为Clerk,而不是Worker。
https://stackoverflow.com/questions/35417361
复制相似问题