使用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
相关产品推荐
相关产品推荐

