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

使用Rest Assured发送POST请求时如何主动省略JSON指定属性

Rest Assured POST请求序列化时省略指定JSON属性的实现方法

你不需要额外创建结构相似的冗余类,直接调整序列化器的配置即可实现未赋值属性自动省略的效果,核心是先解决两个序列化默认行为的问题:

  • 引用类型(比如String name)未赋值时为null,默认序列化会输出"name": null
  • 基本数据类型(比如示例代码里的int age)未赋值时存在默认值(int默认是0),默认序列化会直接输出"age": 0

方案1:实体类加注解(最简便,推荐优先使用)

Rest Assured默认使用Jackson做JSON序列化,首先你需要把实体类里的基本类型替换成对应的包装类——因为基本类型没有null状态,序列化器无法区分字段是“未赋值”还是“主动设为默认值”。
之后在类或者字段上加@JsonInclude注解,指定序列化时跳过null值字段即可:

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Builder;

@Builder
// 类上加注解代表整个类的所有字段都遵循规则:值为null就不序列化
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
    // 把int改成包装类Integer,未赋值时为null,才能被识别为需要跳过的字段
    Integer age;
    String name;
}

改完之后直接正常构建对象发请求即可:

  • Person.builder().name("John").build() 序列化结果为 {"name":"John"}
  • Person.builder().age(29).build() 序列化结果为 {"age":29}
    完全符合需要的格式。
    如果你只想给单个字段配置跳过规则,把@JsonInclude注解放到对应字段上就行,不用加在类上。

方案2:全局配置Rest Assured序列化规则(无需修改实体类注解)

如果你不想给实体类加注解,需要对所有请求的序列化统一生效,可以直接在初始化Rest Assured时配置ObjectMapper的全局规则:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.restassured.config.ObjectMapperConfig;
import io.restassured.config.RestAssuredConfig;
import static io.restassured.RestAssured.given;

public class Main {
    public static void main(String [] args){
        // 配置Jackson序列化时自动跳过null值字段
        ObjectMapper customMapper = new ObjectMapper()
                .setSerializationInclusion(JsonInclude.Include.NON_NULL);

        RestAssuredConfig requestConfig = RestAssuredConfig.config()
                .objectMapperConfig(ObjectMapperConfig.objectMapperConfig()
                        .jackson2ObjectMapperFactory((cls, charset) -> customMapper));

        Person p1 = Person.builder().name("John").build();
        Person p2 = Person.builder().age(29).build();

        // 发请求时传入自定义配置
        given()
                .config(requestConfig)
                .contentType("application/json")
                .body(p1)
                .when().post("/your/target/endpoint")
                .then().statusCode(200);
    }
}

注意这个方案依然需要把实体类的基本类型替换为包装类,否则基本类型的默认值会被正常序列化。

方案3:使用Gson作为序列化器的配置

如果你的项目里Rest Assured配置的是Gson而非Jackson,逻辑更简单:Gson默认就不会序列化值为null的字段,你只需要把实体类的基本类型替换为包装类,不需要额外加注解或者配置就能自动跳过未赋值的字段。如果之前手动配置了.serializeNulls()开启null值输出,删掉该配置即可。


可选扩展规则

如果你需要更严格的跳过逻辑,比如不仅跳过null值,还要跳过值为默认值的字段(比如0、空字符串、空集合),可以把@JsonInclude的规则替换为JsonInclude.Include.NON_DEFAULT,注意这个规则下主动赋值为0、空字符串的字段也会被跳过,根据业务测试场景按需选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:30:53