如何将导出的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
相关产品推荐
相关产品推荐

