Java中使用RestAssured动态修改JSON请求的日期字段
在RestAssured接口测试中批量替换JSON请求的指定日期字段
核心思路
通过JSON解析库(以Jackson为例)读取并解析JSON文件,递归遍历所有键值对,匹配目标字段(日期、date1、date2)后,替换为LocalDate.now().plusDays(180)生成的日期字符串,最后将修改后的JSON作为请求体传入RestAssured。
步骤实现
1. 确保依赖(Maven)
如果项目中还没引入Jackson,添加以下依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 使用最新稳定版即可 --> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.15.2</version> </dependency>
2. 编写日期替换工具类
实现递归遍历JSON节点、替换指定字段的逻辑:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.File; import java.io.IOException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class JsonDateReplacer { // 定义需要替换的目标字段名 private static final String[] TARGET_FIELDS = {"日期", "date1", "date2"}; private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); static { // 注册JSR310日期模块,支持LocalDate序列化 OBJECT_MAPPER.registerModule(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule()); } /** * 读取JSON文件并批量替换指定日期字段 * @param jsonFilePath JSON文件路径 * @return 修改后的JSON字符串 * @throws IOException 文件读取或JSON解析异常 */ public static String replaceDatesInJson(String jsonFilePath) throws IOException { JsonNode rootNode = OBJECT_MAPPER.readTree(new File(jsonFilePath)); replaceDatesRecursively(rootNode); return OBJECT_MAPPER.writeValueAsString(rootNode); } /** * 递归遍历JSON节点,替换目标日期字段 * @param node 当前处理的JSON节点 */ private static void replaceDatesRecursively(JsonNode node) { if (node.isObject()) { ObjectNode objectNode = (ObjectNode) node; for (String field : TARGET_FIELDS) { if (objectNode.has(field)) { // 生成目标日期并替换 LocalDate targetDate = LocalDate.now().plusDays(180); objectNode.put(field, targetDate.format(DATE_FORMATTER)); } } // 递归处理子节点 for (JsonNode childNode : node) { replaceDatesRecursively(childNode); } } else if (node.isArray()) { // 处理数组中的每个元素 for (JsonNode arrayElement : node) { replaceDatesRecursively(arrayElement); } } } }
3. 在RestAssured请求中使用
在构造请求时,调用工具类生成修改后的JSON作为请求体:
import io.restassured.RestAssured; import java.io.IOException; public class ApiTest { public static void main(String[] args) throws IOException { // 读取并修改JSON文件 String modifiedJson = JsonDateReplacer.replaceDatesInJson("src/test/resources/request.json"); // 发送RestAssured请求 RestAssured.given() .contentType("application/json") .body(modifiedJson) .when() .post("/api/your-endpoint") .then() .statusCode(200); } }
注意事项
- 如果JSON中目标字段是嵌套在多层对象或数组中,递归逻辑会自动处理所有层级的匹配字段。
- 可以根据需求调整
DATE_FORMATTER的日期格式,确保和接口要求一致。 - 如果使用Gson而非Jackson,逻辑类似,只需替换为Gson的解析和遍历API即可。
内容的提问来源于stack exchange,提问作者gg_man
相关产品推荐
相关产品推荐

