使用org.json.simple解析嵌套JSON转CSV时出现JSONArray强转JSONObject异常
报错根因
你的代码类型转换逻辑完全不匹配JSON的层级结构,直接触发类型不匹配异常:
- 顶层JSON是数组,每个数组元素为单条评估记录的
JSONObject,该层级的强转逻辑是正确的 - 代码中将
assessmentAccounts字段的值强转为JSONObject,但该字段实际存储的是JSONArray,数组内的每个元素才是单条账户维度数据的JSONObject——这就是抛出ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject的直接原因 - 代码取值位置错误:
accountName/assetName这类字段并不在外层评估记录的JSONObject上,而是在assessmentAccounts数组的子元素对象里,就算解决了类型转换问题,直接从外层取值也只会拿到空值 - 存在字段拼写不匹配的隐形坑:你提供的样例JSON中,评估名称的字段实际拼写为
assesmentName(比常规拼写少一个s),后续取值必须和实际JSON字段名完全对齐,否则会取不到值
修复后可直接运行的逻辑
层级遍历逻辑调整为:
- 遍历顶层评估数组,对每条评估记录先取出公共字段:AssessmentID、AssessmentName(为该条评估下所有账户共用的字段)
- 从评估记录中取出
assessmentAccounts对应的JSONArray,逐一遍历数组内的账户对象 - 对每个账户对象取出AccountName、AssetName、ApplicationName、AccountType、environment字段,和之前拿到的评估公共字段拼接为单条CSV记录
- 最终将所有拼接好的CSV内容写入本地文件
可直接使用的修复代码
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import java.io.FileReader; import java.io.FileWriter; public class JsonToCsvConverter { public static void main(String[] args) { JSONParser jsonParser = new JSONParser(); // CSV表头,和需求字段顺序对齐 String csvHeader = "AssessmentID,AssessmentName,AccountName,AssetName,ApplicationName,AccountType,environment\n"; StringBuilder csvContent = new StringBuilder(csvHeader); try (FileReader reader = new FileReader("C:\\Users\\1451615\\genie-projects\\AppOnboarding\\src\\test\\resources\\features\\appdata.json")) { Object parsedResult = jsonParser.parse(reader); JSONArray assessmentList = (JSONArray) parsedResult; // 遍历所有评估记录 for (Object assessmentEntry : assessmentList) { JSONObject assessment = (JSONObject) assessmentEntry; // 取评估公共字段 Long assessmentId = (Long) assessment.get("assessmentID"); String assessmentName = (String) assessment.get("assesmentName"); // 强转为JSONArray,而非JSONObject JSONArray accountList = (JSONArray) assessment.get("assessmentAccounts"); // 遍历所有关联账户 for (Object accountEntry : accountList) { JSONObject account = (JSONObject) accountEntry; // 取账户维度字段 String accountName = (String) account.get("accountName"); String assetName = (String) account.get("assetName"); String applicationName = (String) account.get("applicationName"); String accountType = (String) account.get("accountType"); String environment = (String) account.get("environment"); // 拼接单条CSV行 csvContent.append(String.format("%d,%s,%s,%s,%s,%s,%s\n", assessmentId, assessmentName, accountName, assetName, applicationName, accountType, environment)); } } // 写入CSV文件 try (FileWriter csvWriter = new FileWriter("输出路径/assessment_export.csv")) { csvWriter.write(csvContent.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 字段类型对齐:
assessmentID在JSON中为数字类型,使用Long类型接收即可,不要强转为String - 后续如果导出的字段值本身包含逗号、换行符,需要在拼接CSV时做转义处理,避免文件格式错乱
- 替换代码中的文件路径为你本地的实际路径即可运行
内容的提问来源于stack exchange,提问作者Balaji Sridhar
相关产品推荐
相关产品推荐

