gpt4 book ai didi

java - 使用 Gson 2.3.1 反序列化包含在 Java 中不起作用的接口(interface)的 Json 字符串

转载 作者:行者123 更新时间:2023-12-03 23:15:28 24 4
gpt4 key购买 nike

我正在尝试使用 Gson 将包含接口(interface)的 json 字符串和具有接口(interface)类型的 HashMap 以及包含接口(interface)类型的列表反序列化为 java 对象。但是我得到了

java.lang.RuntimeException:无法为接口(interface) com.abc.Dummy 调用无参数构造函数。为此类型向 Gson 注册 InstanceCreator 可能会解决此问题。

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

Dummy是接口(interface),SubClassDummy是实现类。

public class DummyInstanceCreator implements InstanceCreator<Dummy>{
@Override
public SubClassDummy createInstance(Type type) {
return new SubClassDummy("", 2.5, "abc");
}
}

String data = // some json string with interfaces and List<interface.class>, hashmap<int, interface.class>
gsonBuilder.registerTypeAdapter(Dummy.class, new DummyInstanceCreator());
SubClassDummy context = gson.fromJson(data, SubClassDummy.class);

谁能帮忙解决这个问题?我无法修改我试图反序列化的 java 对象。 它是一个第三方类。所以不能添加任何注释或对该类进行任何修改。如何让 gson 用反序列化值覆盖虚拟值? 我什至无法对 java 对象序列化为 json 字符串的方式进行任何更改。我只是使用给定的 json 字符串将其反序列化为特定的 java 对象。

最佳答案

java.lang.RuntimeException: Unable to invoke no-args constructor for interface com.abc.Dummy

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

public class Dummy {

public Dummy (){
}

[...] // your code
}

一些解释:

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

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

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

关于java - 使用 Gson 2.3.1 反序列化包含在 Java 中不起作用的接口(interface)的 Json 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29739648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com