Java使用org.json.simple解析JSON时director、cast强转报错如何解决
问题原因
你使用的org.json.simple库本身不支持JSON对象到自定义Java类的自动映射:
- 调用
get()方法获取的嵌套结构,对象会返回JSONObject类型、数组会返回JSONArray类型,和你自定义的Director、Cast类没有关联,直接强转必然抛出ClassCastException - 你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
相关产品推荐
相关产品推荐

