使用Gson 2.3.1反序列化包含不在Java中工作的接口的Json String

我试图反序列化包含接口类型的接口和hashmaps的json字符串以及使用Gson将包含接口类型的列表放入java对象中。 但我得到了

java.lang.RuntimeException:无法为com.abc.Dummy接口调用no-args构造函数。 使用Gson为此类型注册InstanceCreator可以解决此问题。

我试图通过实例化构造函数来为实例创建者注册类型适配器,以实现具有虚拟值的类,但是虚拟值不会被反序列化的值覆盖?

Dummy是接口,SubClassDummy是实现类。

public class DummyInstanceCreator implements InstanceCreator{ @Override public SubClassDummy createInstance(Type type) { return new SubClassDummy("", 2.5, "abc"); } } String data = // some json string with interfaces and List, hashmap gsonBuilder.registerTypeAdapter(Dummy.class, new DummyInstanceCreator()); SubClassDummy context = gson.fromJson(data, SubClassDummy.class); 

任何人都可以帮助解决这个问题吗? 我无法修改我试图反序列化的java对象。 它是第三方课程 。 因此无法添加任何注释或对该类进行任何修改。 如何让gson用反序列化值覆盖虚拟值? 我甚至无法对java对象如何序列化为json字符串进行任何更改。 我只是将json字符串用于将其反序列化为特定的java对象。

java.lang.RuntimeException:无法为接口com.abc.Dummy调用no-args构造函数

你的Dummy需要是一个类(不是接口)并重新查询一个默认/空的无args构造函数:

 public class Dummy { public Dummy (){ } [...] // your code } 

一些解释:

Json解析器以这种方式创建Dummy实例:

 Dummy instance = Dummy.class.newInstance(); // calls default constructor 

然后将初始化使用reflectionAPI instance 。 因此,如果您的类没有实现默认构造函数, Dummy.class.newInstance()将失败。