含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
相关产品推荐
相关产品推荐

