如何搭配JsonIncludeProperties与JsonUnwrapped仅展开嵌套对象指定字段
可以搭配@JsonIncludeProperties与@JsonUnwrapped实现仅展开manager的name属性,但需要注意版本兼容和前缀配置,另外还有更简洁的方案可以直接匹配你需要的输出结构,具体如下:
方案1:@JsonUnwrapped + @JsonIncludeProperties 组合(Jackson 2.12及以上版本支持)
这两个注解搭配使用确实可以过滤掉manager中不需要的字段,不过要注意添加前缀避免和外层Staff类的name属性冲突,示例代码如下:
public class Staff { private String name; private Integer age; @JsonUnwrapped(prefix = "manager", onEmpty = JsonUnwrapped.OnEmpty.IGNORE) @JsonIncludeProperties("name") private Staff manager; // 原有getter、setter }
注意:该方案序列化后得到的字段名为managername,如果需要完全匹配你预期的manager字段名,推荐用下面两种方案
方案2:自定义Getter实现(兼容性最好、写法最简单)
直接将原manager字段标记为忽略序列化,新增一个返回manager名称的getter即可:
public class Staff { private String name; private Integer age; @JsonIgnore private Staff manager; public String getManager() { return manager != null ? manager.getName() : null; } // 其他字段的getter、setter保持不变 }
这个方案不需要依赖高版本Jackson,序列化后直接输出你需要的"manager": "Timmy"结构,无需额外配置。
方案3:自定义序列化器(适合后续扩展需求)
如果后续有调整manager序列化逻辑的需求,可以用@JsonSerialize绑定自定义序列化器实现:
- 先定义序列化器类
public class ManagerNameSerializer extends StdSerializer<Staff> { public ManagerNameSerializer() { super(Staff.class); } @Override public void serialize(Staff manager, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(manager.getName()); } }
- 给manager字段添加序列化注解
public class Staff { private String name; private Integer age; @JsonSerialize(using = ManagerNameSerializer.class) private Staff manager; // 原有getter、setter }
内容的提问来源于stack exchange,提问作者Fanny
相关产品推荐
相关产品推荐

