使用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()
将失败。