Java解析JSON报ClassCastException 如何提取model及variant相关字段
问题根因
你遇到的ClassCastException是JSON节点类型强转错误导致的:在org.json.simple的实现中,{}包裹的键值对结构对应JSONObject类型,[]包裹的列表结构对应JSONArray类型,你在解析过程中把某层本该是JSONObject的节点直接强转成了JSONArray,才会抛出这个异常。
另外你提供的JSON样本本身存在语法错误:多处imageUrl字段末尾多写了冗余逗号,文件末尾存在多余的数组闭合括号,需要先修正这些语法问题才能正常完成解析。
字段层级梳理
你需要读取的三个字段,在JSON结构中的路径从上到下如下,每层类型标注清楚,避免强转错误:
- 根节点:
JSONObject类型,包含models字段 root.models:JSONObject类型,包含区域标识字段INroot.models.IN:JSONArray类型,数组每个元素是区域下的大车型条目root.models.IN[*]:JSONObject类型,这里可以直接读取外层的modelName、modelTagline字段,该节点还包含内层具体车型数组modelsroot.models.IN[*].models[*]:JSONObject类型,这里可以读取具体车型的tagLine字段,该节点还包含车型变体数组variantsroot.models.IN[*].models[*].variants[*]:JSONObject类型,这里可以读取对应车型的variantCode字段
参考实现代码
先确保你已经正确引入json-simple依赖,解析逻辑参考如下:
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import java.io.FileReader; public class CarJsonParser { public static void main(String[] args) throws Exception { JSONParser jsonParser = new JSONParser(); // 替换为你的JSON文件实际存储路径 JSONObject rootNode = (JSONObject) jsonParser.parse(new FileReader("car_model.json")); // 逐层读取节点,严格对应类型强转 JSONObject firstLevelModels = (JSONObject) rootNode.get("models"); JSONArray inRegionModels = (JSONArray) firstLevelModels.get("IN"); // 遍历区域下所有大车型 for (Object regionItem : inRegionModels) { JSONObject bigModel = (JSONObject) regionItem; String modelName = (String) bigModel.get("modelName"); String bigModelTagline = (String) bigModel.get("modelTagline"); System.out.printf("车型系列:%s,系列标语:%s%n", modelName, bigModelTagline); JSONArray specificModels = (JSONArray) bigModel.get("models"); // 遍历系列下所有具体车型 for (Object specificItem : specificModels) { JSONObject specificModel = (JSONObject) specificItem; String modelTagline = (String) specificModel.get("tagLine"); System.out.printf(" 具体车型标语:%s%n", modelTagline); JSONArray variants = (JSONArray) specificModel.get("variants"); // 遍历车型下所有变体 for (Object variantItem : variants) { JSONObject variant = (JSONObject) variantItem; String variantCode = (String) variant.get("variantCode"); System.out.printf(" 变体编码:%s%n", variantCode); } } } } }
注意事项
- 每次强转前先对照JSON结构确认节点类型:遇到大括号结构转
JSONObject,遇到方括号结构转JSONArray,不要凭猜测强转节点类型 - 如果JSON结构可能动态调整,可以在强转前用
instanceof关键字判断节点实际类型,避免运行时抛出类型转换异常 - 解析前先用JSON校验工具检查文件语法,多余逗号、括号不匹配等问题会直接导致解析阶段失败,不会走到字段读取逻辑
内容的提问来源于stack exchange,提问作者Avish
相关产品推荐
相关产品推荐

