Java如何原样存储含冒号的字符串?用于Rest Assured Post请求
解决CSV读取JSON字符串及Rest Assured参数提取问题
我之前也碰到过类似的CSV读取特殊字符的坑,给你几个实用的解决方案:
首先解决冒号导致存储异常的核心问题:
- 问题本质大概率是CSV读取工具默认把逗号当成分隔符,但如果你的JSON字段没被双引号包裹,读取时可能被误拆分(哪怕是冒号,某些简陋的读取逻辑也可能出问题)。所以一定要用专业的CSV解析库来处理:
- 比如用OpenCSV或者Apache Commons CSV,它们会自动识别被双引号包裹的完整字段,不管里面有冒号、逗号这些特殊字符。举个OpenCSV的示例:
CSVReader reader = new CSVReader(new FileReader("your-data.csv")); String[] row; while ((row = reader.readNext()) != null) { // row[对应列索引] 就是完整的JSON字符串,不会被拆分 String jsonStr = row[0]; // 接下来处理这个字符串即可 } - 如果是手动构造测试字符串,记得转义双引号,比如:
String jsonStr = "{ \"CompanyName\" : \"TestCompanyWithAllParams\",\"CommercialId\":\"AB1C\" }"; - 要是用Java 15+,还可以用文本块,完全不用转义:
String jsonStr = """ { "CompanyName" : "TestCompanyWithAllParams","CommercialId":"AB1C" } """;
- 比如用OpenCSV或者Apache Commons CSV,它们会自动识别被双引号包裹的完整字段,不管里面有冒号、逗号这些特殊字符。举个OpenCSV的示例:
接下来是提取参数并用于Rest Assured Post请求的几种方式:
方法1:用Jackson解析到实体类(规范写法)
适合参数较多、需要复用的场景:
- 先定义对应实体类:
public class Company { private String CompanyName; private String CommercialId; // 生成无参构造、getter和setter方法 public String getCompanyName() { return CompanyName; } public void setCompanyName(String companyName) { CompanyName = companyName; } public String getCommercialId() { return CommercialId; } public void setCommercialId(String commercialId) { CommercialId = commercialId; } } - 解析字符串并构造请求:
ObjectMapper objectMapper = new ObjectMapper(); Company company = objectMapper.readValue(jsonStr, Company.class); // 发送Rest Assured请求 given() .contentType(ContentType.JSON) .body("{\"CompanyName\":\"" + company.getCompanyName() + "\", \"CommercialId\":\"" + company.getCommercialId() + "\"}") .when() .post("your-api-endpoint-url") .then() .statusCode(200);
方法2:用Rest Assured自带JSONPath直接提取(快捷写法)
不想写实体类的话,直接用JSONPath提取参数:
// 将字符串转为JsonPath对象 JsonPath jsonPath = new JsonPath(jsonStr); // 提取所需参数 String companyName = jsonPath.getString("CompanyName"); String commercialId = jsonPath.getString("CommercialId"); // 构造并发送请求 given() .contentType(ContentType.JSON) .body("{\"CompanyName\":\"" + companyName + "\", \"CommercialId\":\"" + commercialId + "\"}") .when() .post("your-api-endpoint-url") .then() .statusCode(200);
方法3:直接复用完整JSON作为请求体(最简写法)
如果你的Post请求正好需要这个完整的JSON结构,那甚至不用提取参数,直接用读取到的字符串:
given() .contentType(ContentType.JSON) .body(jsonStr) // 直接传入从CSV拿到的完整JSON字符串 .when() .post("your-api-endpoint-url") .then() .statusCode(200);
内容的提问来源于stack exchange,提问作者Mahesh Patil
相关产品推荐
相关产品推荐

