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

如何将导出的CSV数据转换为JSON格式(Java自动化场景)

Java技术栈下CSV转JSON自动化实现方案

适配你当前使用的Cucumber + Selenium Java + RestAssured 技术栈,不需要额外引入冗余依赖,以下是两种可直接落地的实现:


方案1:零额外依赖实现(轻量场景首选)

RestAssured 本身内置了Jackson序列化依赖,不需要额外引入JSON处理包,配合Java原生IO即可完成转换:

  • 首先通过Selenium定位导出按钮触发下载,加显式等待确认CSV文件在下载目录落盘完成
  • 逐行读取CSV内容,第一行拆分作为JSON字段key,后续每行按逗号拆分后和key一一映射,封装为List<Map<String, Object>>结构,注意数字类型字段(Student ID、Enrollment ID、Amount)不要转成字符串,直接存Integer类型
  • 调用Jackson的ObjectMapper直接把集合序列化为JSON字符串即可,输出的JSON可以直接传给RestAssured做接口请求或者断言

示例工具类代码:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;

public class CsvToJsonUtil {
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static String convertCsvToJson(String csvFilePath) throws Exception {
        List<Map<String, Object>> dataList = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(new FileReader(csvFilePath))) {
            // 读取表头行
            String[] headers = br.readLine().split(",");
            String line;
            while ((line = br.readLine()) != null) {
                String[] values = line.split(",");
                Map<String, Object> row = new LinkedHashMap<>();
                for (int i = 0; i < headers.length; i++) {
                    String header = headers[i].trim();
                    String value = values[i].trim();
                    // 数字字段做类型转换,避免全序列化为字符串
                    if (List.of("Student ID", "Enrollment ID", "Amount").contains(header)) {
                        row.put(header, Integer.parseInt(value));
                    } else {
                        row.put(header, value);
                    }
                }
                dataList.add(row);
            }
        }
        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataList);
    }
}

针对你给出的CSV样例,转换后的JSON结构符合常规接口传参要求:

[
  {
    "Student ID": 1,
    "Due Date": "23-10-2021",
    "Enrollment ID": 346,
    "Joining Date": "23-12-2021",
    "Amount": 23000,
    "Currency": "RS"
  }
]

方案2:OpenCSV解析实现(复杂CSV场景首选)

如果后续CSV可能出现带引号、字段内含逗号、换行等特殊内容,手写逗号拆分容易出错,可以引入OpenCSV做解析,鲁棒性更强:

  • 在项目pom中添加OpenCSV依赖即可,不需要额外调整现有框架配置
  • 用CSVReaderHeaderAware类读取文件,会自动完成表头和行数据的映射,不需要手动拆分字符串,后续序列化逻辑和方案1一致

适配Cucumber的步骤定义示例,可以直接嵌入你的现有自动化流程:

import io.cucumber.java.en.Then;
import static io.restassured.RestAssured.given;

public class ExportStepDefs {
    @Then("导出的CSV文件转换为JSON后可正常提交接口")
    public void csvConvertAndSendRequest() throws Exception {
        // 替换为Selenium获取到的下载文件实际路径
        String csvPath = "/downloads/student_data.csv";
        String jsonPayload = CsvToJsonUtil.convertCsvToJson(csvPath);
        // 直接传给RestAssured做接口请求/断言
        given()
                .contentType("application/json")
                .body(jsonPayload)
                .when()
                .post("/your/api/endpoint")
                .then()
                .statusCode(200);
    }
}

注意事项

  • Selenium触发下载后必须加文件存在性+文件大小稳定的显式等待,避免文件未下载完成就读取导致空指针或内容缺失
  • 日期字段如果没有特殊业务要求,直接保留CSV里的dd-MM-yyyy字符串格式即可,不需要额外做格式转换
  • 如果需要做JSON结构断言,可以直接把转换后的JSON字符串反序列化为RestAssured的JsonPath对象,直接读字段值做校验,和你现有接口自动化断言逻辑完全兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:51:18