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

Java使用org.json.simple解析JSON时director、cast强转报错如何解决

问题原因

你使用的org.json.simple库本身不支持JSON对象到自定义Java类的自动映射:

  1. 调用get()方法获取的嵌套结构,对象会返回JSONObject类型、数组会返回JSONArray类型,和你自定义的Director、Cast类没有关联,直接强转必然抛出ClassCastException
  2. 你JSON结构里的cast是数组格式,但现有Movie类里将cast定义为单个Cast对象,结构不匹配,也会导致解析失败

修复步骤

1. 补全自定义类定义,修正字段类型

首先补全Director、Cast类的构造方法,同时修改Movie类的cast字段为数组类型匹配JSON结构:

// Director类定义
public class Director {
    private String fullName;
    public Director(String fullName) {
        this.fullName = fullName;
    }
    // 按需补充getter、setter方法
}
// Cast类定义
public class Cast {
    private String fullName;
    private String role;
    public Cast(String fullName, String role) {
        this.fullName = fullName;
        this.role = role;
    }
    // 按需补充getter、setter方法
}
// 修正后的Movie类
public class Movie {
    private String name;
    private long year;
    private String description;
    private Director director;
    private Cast[] cast; // 单个Cast改为Cast数组匹配JSON结构

    public Movie(String name, long year, String description, Director director, Cast[] cast) {
        this.name = name;
        this.year = year;
        this.description = description;
        this.director = director;
        this.cast = cast;
    }
    // 按需补充getter、setter方法
}

2. 手动解析嵌套字段

修改解析逻辑,手动把嵌套的JSONObject、JSONArray映射为你自定义的类对象,不能直接强转:

public Movie[] getValueOfMovie()throws Exception{
    JSONParser parser = new JSONParser();
    try(FileReader reader = new FileReader("movies.json")){

        JSONObject rootJsonObj = (JSONObject) parser.parse(reader);
        JSONArray moviesJsonArray = (JSONArray)rootJsonObj.get("movies");

        Movie[] films = new Movie[moviesJsonArray.size()];
        int q=0;
        for (Object mO: moviesJsonArray){
            JSONObject moviesJsonObj = (JSONObject) mO;
            
            // 手动解析director嵌套对象
            JSONObject directorJson = (JSONObject) moviesJsonObj.get("director");
            Director director = new Director((String) directorJson.get("fullName"));
            
            // 手动解析cast数组
            JSONArray castJsonArray = (JSONArray) moviesJsonObj.get("cast");
            Cast[] casts = new Cast[castJsonArray.size()];
            for (int i = 0; i < castJsonArray.size(); i++) {
                JSONObject castJson = (JSONObject) castJsonArray.get(i);
                casts[i] = new Cast((String) castJson.get("fullName"), (String) castJson.get("role"));
            }

            films[q] = new Movie((String) moviesJsonObj.get("name"),
                    (Long) moviesJsonObj.get("year"),
                    (String) moviesJsonObj.get("description"),
                    director,
                    casts);
            q++;
        }
        return films;

    }catch(FileNotFoundException e){
        e.printStackTrace();
    }
    return null;
}

可选优化方案

如果不想手动编写大量解析逻辑,可以换用Gson、Jackson这类专业的JSON序列化/反序列化库,只要字段名和JSON结构匹配,就能直接把JSON自动转换为Java对象,不需要手动逐个字段解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:45:01