You need to enable JavaScript to run this app. 使用org.json.simple解析嵌套JSON转CSV时出现JSONArray强转JSONObject异常
优惠活动
大模型
产品
解决方案
定价
更多

使用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字段名完全对齐,否则会取不到值
修复后可直接运行的逻辑

层级遍历逻辑调整为:

  1. 遍历顶层评估数组,对每条评估记录先取出公共字段:AssessmentID、AssessmentName(为该条评估下所有账户共用的字段)
  2. 从评估记录中取出assessmentAccounts对应的JSONArray,逐一遍历数组内的账户对象
  3. 对每个账户对象取出AccountName、AssetName、ApplicationName、AccountType、environment字段,和之前拿到的评估公共字段拼接为单条CSV记录
  4. 最终将所有拼接好的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 04:27:01