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

使用json-simple解析JSON文件时遇ClassCastException问题求助

解决org.json.simple.JSONArray无法转换为JSONObject的ClassCastException错误

兄弟,你的问题很典型——JSON结构和解析代码的类型不匹配,咱们一步步来解决:

问题根源

先把你的JSON格式化一下,就能一眼看出问题:

[
  [
    {
      "TestScenario_1": {
        "Transaction": "A",
        "description": "This is a test A",
        "Co-no": "",
        "Project": "Proj1"
      }
    }
  ],
  [
    {
      "TestScenario_2": {
        "Transaction": "B",
        "description": "This is a test B",
        "Co-no": "",
        "Project": "Proj2"
      }
    }
  ]
]

你的JSON最外层是JSON数组(用[]包裹),但你在代码里直接把解析结果强制转换成了JSONObject,这就触发了ClassCastException——数组肯定不能直接转成对象啊!

修正后的解析代码

按照JSON的层级结构,咱们逐层解析,代码里加了详细注释,你可以直接用:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParseTest {
    private static final String filePath = "C:\\temp\\mytest2.json";

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        try {
            FileReader reader = new FileReader(filePath);
            JSONParser jsonParser = new JSONParser();

            // 最外层是JSON数组,先转成JSONArray
            JSONArray outerArray = (JSONArray) jsonParser.parse(reader);

            // 遍历外层数组的每个子数组元素
            for (Object outerItem : outerArray) {
                JSONArray innerArray = (JSONArray) outerItem;
                // 遍历子数组里的场景对象
                for (Object innerItem : innerArray) {
                    JSONObject scenarioWrapper = (JSONObject) innerItem;
                    // 遍历每个场景的动态key(比如TestScenario_1、TestScenario_2)
                    for (Object key : scenarioWrapper.keySet()) {
                        String scenarioName = (String) key;
                        System.out.println("TestScenario: " + scenarioName);
                        // 获取嵌套的具体数据对象
                        JSONObject scenarioData = (JSONObject) scenarioWrapper.get(scenarioName);
                        // 提取各个字段
                        String transaction = (String) scenarioData.get("Transaction");
                        System.out.println("Transaction: " + transaction);
                        String description = (String) scenarioData.get("description");
                        System.out.println("Description: " + description);
                        String coNo = (String) scenarioData.get("Co-no");
                        System.out.println("Co-no: " + coNo);
                        String project = (String) scenarioData.get("Project");
                        System.out.println("Project: " + project);
                        System.out.println("------------------------");
                    }
                }
            }

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParseException ex) {
            ex.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }
    }
}

关键修改点说明

  1. 先转成JSONArray:解析结果首先要对应最外层的数组类型,不能直接转JSONObject
  2. 逐层遍历:按照「外层数组→子数组→场景包装对象→嵌套数据对象」的层级一步步解析
  3. 处理动态key:因为你的每个场景用的是TestScenario_1、TestScenario_2这种动态命名的key,所以用keySet()遍历所有key来获取场景名称和对应的数据

给JSON新手的小建议

  • 解析前先格式化JSON:用IDE自带的格式化功能(比如Eclipse里选中JSON文本按Ctrl+Shift+F)或者本地工具把JSON转成易读的结构,搞清楚层级再写代码
  • 牢记类型对应:[]是JSONArray,{}是JSONObject,强制转换前一定要确认类型匹配
  • 避免无意义的SuppressWarnings:原代码里的rawtypes、unused可以去掉,只保留必要的unchecked(因为json-simple是泛型前的库)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:00:12