如何实现TestDef类自定义Jackson序列化,跳过TestStep关联类指定字段?
实现方案
方法1:手动编写自定义Serializer逻辑
直接按以下代码实现TestDefSerializer的serialize方法,手动控制字段输出,同时过滤指定不需要的字段:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.util.List; public class TestDefSerializer extends StdSerializer<TestDef> { // 必须保留无参构造方法 public TestDefSerializer() { super(TestDef.class); } @Override public void serialize(TestDef testDef, JsonGenerator gen, SerializerProvider provider) throws IOException { // 开始生成TestDef对象 gen.writeStartObject(); // 写入name字段 gen.writeStringField("name", testDef.getName()); // 开始写入steps数组 gen.writeArrayFieldStart("steps"); List<TestStep> steps = testDef.getSteps(); if (steps != null && !steps.isEmpty()) { for (TestStep step : steps) { gen.writeStartObject(); // 此处可写入TestStep本身需要保留的其他字段,比如id、stepName等根据实际需求补充 // 处理responseDef,跳过path、method,只保留需要输出的字段 ResponseDef responseDef = step.getResponseDef(); if (responseDef != null) { gen.writeObjectFieldStart("responseDef"); // 示例:保留code、msg字段,可根据你的实际业务调整要输出的字段 gen.writeNumberField("code", responseDef.getCode()); gen.writeStringField("msg", responseDef.getMsg()); gen.writeEndObject(); } // 处理requestDef,跳过matching、status,只保留需要输出的字段 RequestDef requestDef = step.getRequestDef(); if (requestDef != null) { gen.writeObjectFieldStart("requestDef"); // 示例:保留url、body字段,可根据你的实际业务调整要输出的字段 gen.writeStringField("url", requestDef.getUrl()); gen.writeObjectField("body", requestDef.getBody()); gen.writeEndObject(); } gen.writeEndObject(); } } gen.writeEndArray(); gen.writeEndObject(); } }
方法2:无侵入注解实现(无需自定义Serializer)
如果没有其他特殊序列化逻辑,只是要过滤指定字段,可以直接用Jackson自带注解实现,不需要手写序列化方法:
- 在
ResponseDef类上加@JsonIgnoreProperties(value = {"path", "method"}) - 在
RequestDef类上加@JsonIgnoreProperties(value = {"matching", "status"})
配置完成后Jackson自动会忽略指定字段,你原有的@JsonSerialize标注也可以移除。
内容的提问来源于stack exchange,提问作者Aditya Anand
相关产品推荐
相关产品推荐

