使用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(); } } }
关键修改点说明
- 先转成JSONArray:解析结果首先要对应最外层的数组类型,不能直接转JSONObject
- 逐层遍历:按照「外层数组→子数组→场景包装对象→嵌套数据对象」的层级一步步解析
- 处理动态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
相关产品推荐
相关产品推荐

