使用GSON将JSON反序列化为Java对象时报类型转换错误如何解决
GSON反序列化错误原因及解决方案
错误原因
- 实体类与JSON结构不匹配:JSON最外层是包含
movies字段的对象,并非直接的电影数组;同时cast字段直接存储演员信息对象,你定义的Cast类属于多余的嵌套层,结构无法对应。 - 反序列化类型传参错误:你调用
fromJson时传入的类型是Movies.class,返回结果为单个Movies对象,却直接赋值给Movies[]数组类型的变量,触发类转换异常。 - 内部类未加static修饰:非静态内部类会持有外部类的引用,Gson反序列化时无法直接实例化这类内部类,即使结构匹配也会抛出实例化异常。
修正后代码
import com.google.gson.Gson; import java.io.*; import java.util.ArrayList; public class Main { public static void main(String[] args) throws FileNotFoundException { Gson gson = new Gson(); // 反序列化匹配外层JSON结构 MovieResponse movieResponse = gson.fromJson(new FileReader("src/main/input.json"), MovieResponse.class); Movies[] movies = movieResponse.movies; System.out.println(movies[0].name); } // 外层包装类,匹配JSON最外层结构 static class MovieResponse { Movies[] movies; } // 改为静态内部类,删除多余嵌套 static class Movies { String name; String url; String IMAX; String rating; ArrayList<CastMember> cast; } // 改为静态内部类 static class CastMember{ String character; String actor; } }
关键修改说明
- 新增
MovieResponse静态内部类作为反序列化的目标类型,对应JSON最外层的对象结构,内部movies字段对应JSON中的电影数组。 - 删除冗余的
Cast类,将Movies类中的cast字段类型直接改为ArrayList<CastMember>,匹配JSON中cast字段的结构。 - 所有自定义实体内部类都添加
static修饰,避免Gson实例化失败。 - 修正反序列化逻辑,先获取外层包装对象,再从中取出电影数组,类型完全匹配无转换问题。
内容的提问来源于stack exchange,提问作者Matt Demo
相关产品推荐
相关产品推荐

