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

Java读取JSON多字段报JSONObject转JSONArray异常如何解决

问题原因

你抛出的ClassCastException是JSON节点类型判断错误导致的:json-simple库中,{}包裹的键值对结构对应JSONObject类型,[]包裹的列表结构对应JSONArray类型,你之前的代码把最外层models键对应的JSONObject直接强转成了JSONArray,类型不匹配就会触发这个报错。

正确读取步骤

先梳理你提供的JSON结构层级,逐层读取即可:

  • 最外层是根JSONObject,取models键得到的是地区键映射模型列表的JSONObject(不是数组,这是报错的核心点)
  • 从上述对象中取对应地区键(比如示例里的IN),得到的才是车系列表JSONArray
  • 遍历车系数组,每个元素是车系JSONObject,可以直接取出modelName、modelTagline字段
  • 每个车系对象下的models键是具体车型配置数组,遍历后取每个配置对象下的variants数组
  • 遍历变参数组,每个元素是变体JSONObject,即可取出variantCode字段
可运行参考代码
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.FileReader;

public class BikeModelParser {
    public static void main(String[] args) throws Exception {
        JSONParser jsonParser = new JSONParser();
        // 替换为你的JSON文件实际路径
        JSONObject rootNode = (JSONObject) jsonParser.parse(new FileReader("model-config.json"));

        // 注意:这里是JSONObject,不要强转成JSONArray
        JSONObject modelsContainer = (JSONObject) rootNode.get("models");
        // 取IN区域的车系列表,这一层才是数组
        JSONArray inSeriesList = (JSONArray) modelsContainer.get("IN");

        for (Object seriesItem : inSeriesList) {
            JSONObject series = (JSONObject) seriesItem;
            // 读取车系名称、宣传语
            String modelName = (String) series.get("modelName");
            String tagline = (String) series.get("modelTagline");
            System.out.printf("车系:%s | 宣传语:%s%n", modelName, tagline);

            JSONArray detailList = (JSONArray) series.get("models");
            for (Object detailItem : detailList) {
                JSONObject detail = (JSONObject) detailItem;
                JSONArray variantList = (JSONArray) detail.get("variants");
                // 判空避免空指针
                if (variantList == null) continue;
                for (Object variantItem : variantList) {
                    JSONObject variant = (JSONObject) variantItem;
                    String variantCode = (String) variant.get("variantCode");
                    System.out.printf("  关联变体编码:%s%n", variantCode);
                }
            }
        }
    }
}
注意事项
  • 实际运行前先检查你的JSON文件格式,你贴出的示例末尾缺失了几个闭合括号,属于不合法JSON,会触发解析错误,先补全括号保证结构完整
  • 生产环境使用时建议在每次类型转换前加instanceof校验,避免JSON结构和预期不符时抛出类型转换异常、空指针异常
  • 如果后续JSON结构持续迭代,手动逐层强转的代码维护成本很高,可以替换为Jackson、Gson等支持JSON直接映射Java POJO的类库,减少手动类型转换的代码量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:18:19