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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:46:08