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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:15:03