深入理解 @JsonGetter:精准掌控前端返回数据格式!
在 Java 后端开发中,我们常常会遇到这样一个问题:
💭 某个字段在后端需要保留原始格式进行业务处理,但返回给前端时希望转为另一种格式展示。
比如:你在数据库中保存的是 tokens = 12500
(整型),但希望返回给前端的时候是 12.500
(千分制,小数点后保留 3 位)。
这时候,Jackson 提供的注解 —— @JsonGetter
💡 就能大显身手!
🔍 什么是 @JsonGetter
?
@JsonGetter
是 Jackson 提供的序列化注解之一,作用是:
✅ 指定某个方法用于序列化字段时的 JSON 值获取逻辑。
📌 也就是说,默认情况下 Jackson 会调用字段的 getter 方法(如 getTokens()
),但如果你加上了 @JsonGetter("tokens")
,它会优先使用你标注的方法作为序列化输出。
🛠 实际用法:原始字段用于业务,自定义方法用于 JSON 序列化
下面是一个实际场景示例:
public class TokenUsage {// 原始字段:单位是“个”,如 12500 个private String tokens;// 原始 getter 方法,供后端业务逻辑使用public String getTokens() {return tokens;}public void setTokens(String tokens) {this.tokens = tokens;}// 自定义 JSON 输出格式:返回千分单位,并保留 3 位小数@JsonGetter("tokens")public String getTokenRaw() {if (tokens == null) {return null;}// 精确计算,避免浮点误差BigDecimal value = new BigDecimal(tokens).divide(new BigDecimal(1000), 3, RoundingMode.HALF_UP);return value.setScale(3, RoundingMode.HALF_UP).toString();}
}
✅ 效果如下:
场景 | 返回结果 |
---|---|
后端使用 getTokens() | 返回 "12500" (字符串) |
前端收到 JSON 响应 | 返回 "12.500" |
🚀 优势总结
优势 💡 | 描述 |
---|---|
🔄 保留后端原始数据 | 不影响业务逻辑处理,原始 getter 可照常使用 |
🧪 精准控制前端格式 | 自定义方法决定序列化样式 |
🧼 避免字段冗余 | 无需新增冗余字段,仅通过注解控制输出 |
💥 与 @JsonIgnore 、@JsonProperty 兼容 | 可组合使用,控制更灵活 |
❗注意事项
-
方法名不一定要以
get
开头,只要加上@JsonGetter("xxx")
,序列化时就会使用它作为xxx
字段的值。 -
千万不要和原始字段名冲突,否则会出现双字段或冲突序列化的问题。
-
一般只用于输出,如需控制输入格式,需配合
@JsonSetter
或@JsonProperty
使用。
📎 小贴士:增强阅读体验的小工具建议
为了让这个字段在 Swagger 或 OpenAPI 接口文档中也显示为处理后的格式,可考虑:
@ApiModelProperty(value = "令牌数(单位:千,保留3位小数)", example = "12.500")
@JsonGetter("tokens")
public String getTokenRaw() {// ...
}
🧩 总结一句话:
使用
@JsonGetter
,你可以在不影响后端原始逻辑的前提下,优雅地控制前端 JSON 的展示格式!
如果你想继续优化返回结构,比如返回对象中的多个字段进行统一格式转换,甚至封装公共转换器,我也可以为你提供完整的方案和代码模板!欢迎继续提问 🤝💬