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

如何搭配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绑定自定义序列化器实现:

  1. 先定义序列化器类
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());
    }
}
  1. 给manager字段添加序列化注解
public class Staff {
  private String name;
  private Integer age;
  @JsonSerialize(using = ManagerNameSerializer.class)
  private Staff manager;
  // 原有getter、setter
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:36:01