使用Rest Assured进行API测试时移除JSON请求体指定嵌套字段的问题求助
如何移除JSON请求体中嵌套的特定字段(Rest Assured + Jackson)
我明白你的问题了——你要移除的FIELDTOREMOVE字段并不是在JSON的根节点,而是嵌套在foo数组的第一个对象里,所以你之前直接在根JsonNode上查找该字段的代码自然返回null,移除操作也不会生效。下面给你两种可行的解决方案:
方案1:直接操作Java对象(推荐)
既然你本来就是把自定义Java对象转成JSON字符串,那最好在序列化之前就处理掉不需要的字段,这样比操作字符串更安全,也更易维护。
方式A:利用Jackson的忽略Null配置
给你的Java对象字段加上@JsonInclude(JsonInclude.Include.NON_NULL)注解,或者全局配置ObjectMapper忽略null值,然后把要移除的字段设为null,序列化时就不会包含这个字段:
// 全局配置ObjectMapper ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 初始化你的请求对象 RequestPayload payload = new RequestPayload(); // ... 其他字段赋值 ... // 把要移除的字段设为null payload.getFoo().get(0).setFIELDTOREMOVE(null); // 转成JSON字符串 String requestBody = objectMapper.writeValueAsString(payload);
方式B:使用DTO类
如果不想修改原对象的结构或配置,可以创建一个不包含FIELDTOREMOVE字段的DTO类,把原对象的属性复制过去后再序列化:
// 定义不含FIELDTOREMOVE的DTO public class FooItemDTO { private String description; private String ref; private CustomArray customArray; // getters and setters } // 复制属性并序列化 FooItem originalItem = payload.getFoo().get(0); FooItemDTO dtoItem = new FooItemDTO(); dtoItem.setDescription(originalItem.getDescription()); dtoItem.setRef(originalItem.getRef()); dtoItem.setCustomArray(originalItem.getCustomArray()); payload.getFoo().set(0, dtoItem); // 替换原数组中的元素 String requestBody = objectMapper.writeValueAsString(payload);
方案2:操作JSON字符串(如果必须处理已生成的字符串)
如果已经拿到了JSON字符串,需要直接修改的话,要先遍历到嵌套的节点再执行移除操作:
private String removeNestedField(String requestBody) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(requestBody); // 获取foo数组节点 JsonNode fooArray = rootNode.get("foo"); if (fooArray != null && fooArray.isArray() && fooArray.size() > 0) { // 转换为ObjectNode才能修改(JsonNode是只读的) ObjectNode firstFooObject = (ObjectNode) fooArray.get(0); // 移除目标字段 firstFooObject.remove("FIELDTOREMOVE"); } // 把修改后的节点转回字符串 return objectMapper.writeValueAsString(rootNode); }
然后在你的POST方法中调用这个方法:
public void POSTNewRequest(String endpoint, String requestBody) throws JsonProcessingException { // 先移除指定字段,再发起请求 String modifiedBody = removeNestedField(requestBody); response = given().auth().none() .header("Content-Type", "application/json") .contentType(ContentType.JSON) .when() .body(modifiedBody).log().all() .post(endpoint); }
关键说明
你之前的代码失败的核心原因:FIELDTOREMOVE字段位于foo数组的子对象中,而不是JSON根节点。所以jsonNode.get("FIELDTOREMOVE")会返回null,对根节点执行remove("FIELDTOREMOVE")自然不会有任何效果。必须先定位到嵌套的子对象,再执行移除操作。
内容的提问来源于stack exchange,提问作者Sacerdos1
相关产品推荐
相关产品推荐

