You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含CharSequence成员的Java类Gson反序列化报错,如何解决?

解决Gson反序列化包含CharSequence类型成员的Java类问题

咱们来一步步拆解你遇到的问题,找到核心原因并给出解决方案:

第一个错误的本质

你最初碰到的 java.lang.RuntimeException: Unable to invoke no-args constructor for interface java.lang.CharSequence,核心原因是Gson无法直接实例化接口类型。CharSequence是个接口,Gson不知道该用它的哪个实现类(比如String、StringBuilder)来创建对象,所以抛出了这个异常。

第二个错误的根源

你写的CharSequenceAdapter里的read方法逻辑出错了!JSON里的name字段是一个普通字符串值("dinesh"),但你的代码里调用了in.beginObject()——这是在告诉Gson“接下来要解析一个JSON对象”,但实际遇到的是字符串,所以才会触发Expected BEGIN_OBJECT but was STRING的错误。

正确的CharSequence适配器实现

咱们把适配器改得贴合实际场景:读取JSON字符串直接返回(因为String本身就是CharSequence的实现类);写入时把CharSequence转成字符串输出即可。

class CharSequenceAdapter extends TypeAdapter<CharSequence> {
    @Override
    public void write(JsonWriter out, CharSequence value) throws IOException {
        // 把CharSequence转成字符串写入JSON,兼容null情况
        out.value(value != null ? value.toString() : null);
    }

    @Override
    public CharSequence read(JsonReader in) throws IOException {
        // 直接读取JSON字符串,String本身就实现了CharSequence接口
        return in.nextString();
    }
}

正确的Gson配置与测试

用修正后的适配器重新配置Gson,就能正常完成反序列化了:

Person p;
GsonBuilder builder = new GsonBuilder()
        .registerTypeAdapter(CharSequence.class, new CharSequenceAdapter());
Gson gson = builder.create();

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

// 建议给Person类重写toString方法方便查看结果
// @Override
// public String toString() {
//     return "Person{name='" + name + "'}";
// }
System.out.println(p); // 输出结果:Person{name='dinesh'}

额外说明

如果后续需要支持更复杂的CharSequence实现场景,可以在适配器里扩展逻辑,但针对你的需求,直接返回String完全够用——毕竟JSON里的字符串天然对应Java的String类型,而且String是最常用的CharSequence实现类。

内容的提问来源于stack exchange,提问作者Dinesh Raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:55