反序列化包含 java.lang.CharSequence 成员变量的类

2024-02-21

我有一个简单的类包含name类型变量java.lang.CharSequence

    class Person {
    public java.lang.CharSequence name;
}

当我尝试使用 GSON 库反序列化 JSON 字符串时

        Person p;
        Gson gson = new Gson();
        String json = "{\"name\":\"dinesh\"}";
        p = gson.fromJson(json, Person.class);
        System.out.println(p);

它给了我以下错误:

java.lang.RuntimeException:无法调用接口 java.lang.CharSequence 的无参数构造函数。向 Gson 注册此类型的 InstanceCreator 可能会解决此问题。

我该如何解决?我无法改变Person.name键入至String.

正如评论中所建议的,

我创建了一个自定义适配器CharSequence

class CharSequenceAdapter extends TypeAdapter<CharSequence> {

    @Override
    public void write(JsonWriter out, CharSequence value) throws IOException {
        
    }

    @Override
    public CharSequence read(JsonReader in) throws IOException {
        String s = new String();
        in.beginObject();
        while(in.hasNext()) {
            s = in.nextString();
        }
        return s;
    }
    
}

我的 GSON 构建器如下所示:

Person p;
GsonBuilder builder = new GsonBuilder().registerTypeAdapter(java.lang.CharSequence.class, new CharSequenceAdapter());
Gson gson = builder.create();
String json = "{\"name\":\"dinesh\"}";
p = gson.fromJson(json, Person.class);
System.out.println(p);

现在它给了我另一个错误:

应为 BEGIN_OBJECT,但在第 1 行第 10 列路径 $.name 处为 STRING

我错过了什么?

我不认为这是重复的。所有其他问题都讨论将一个类或接口作为一个整体进行反序列化。我遇到一个将接口引用作为成员变量的类的问题。我无法从类似的答案中解决问题。


CharSequence 是一个接口。

当 Gson 尝试将 json 字符串反序列化为对象时,它会“内省”该对象(通过使用反射)并尝试解析字段的类型。 然后它试图创造一个那个时代的领域。

开箱即用的 Gson 可以处理许多“广泛使用”的类型,如 String、Integer、Boolean 等,但是当 GSon 不知道某些内容时(如本例中的 CharSequence),GSon 会因错误而停止。

现在很明显,您应该“教”Gson 理解这种自定义类型。 为此,Gson 中有类型适配器。

Here https://www.tutorialspoint.com/gson/gson_custom_adapters.htm您可以找到有关使用适配器的简短教程。 我不会在这里重写一个示例,但一般来说,您应该创建一个适配器,将其注册到 Gson 对象上并调用您的代码。当 Gson 到达 CharSequence 字段时,它将找到这个自定义适配器并调用它

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化包含 java.lang.CharSequence 成员变量的类 的相关文章

随机推荐