深入理解 @JsonGetter:精准掌控前端返回数据格式!

在 Java 后端开发中,我们常常会遇到这样一个问题:

💭 某个字段在后端需要保留原始格式进行业务处理,但返回给前端时希望转为另一种格式展示。

比如:你在数据库中保存的是 tokens = 12500(整型),但希望返回给前端的时候是 12.500(千分制,小数点后保留 3 位)。

这时候,Jackson 提供的注解 ------ @JsonGetter 💡 就能大显身手!

🔍 什么是 @JsonGetter

@JsonGetter 是 Jackson 提供的序列化注解之一,作用是:

指定某个方法用于序列化字段时的 JSON 值获取逻辑

📌 也就是说,默认情况下 Jackson 会调用字段的 getter 方法(如 getTokens()),但如果你加上了 @JsonGetter("tokens"),它会优先使用你标注的方法作为序列化输出。

🛠 实际用法:原始字段用于业务,自定义方法用于 JSON 序列化

下面是一个实际场景示例:

java 复制代码
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 接口文档中也显示为处理后的格式,可考虑:

java 复制代码
@ApiModelProperty(value = "令牌数(单位:千,保留3位小数)", example = "12.500")
@JsonGetter("tokens")
public String getTokenRaw() {
    // ...
}

🧩 总结一句话:

使用 @JsonGetter,你可以在不影响后端原始逻辑的前提下 ,优雅地控制前端 JSON 的展示格式


如果你想继续优化返回结构,比如返回对象中的多个字段进行统一格式转换,甚至封装公共转换器,我也可以为你提供完整的方案和代码模板!欢迎继续提问 🤝💬

相关推荐
饕餮争锋18 分钟前
Kotlin: [Internal Error] java.lang.NoSuchFieldError: FILE_HASHING_STRATEGY
java·kotlin
明洞日记20 分钟前
【设计模式手册014】解释器模式 - 语言解释的优雅实现
java·设计模式·解释器模式
华仔啊28 分钟前
图片标签用 img 还是 picture?很多人彻底弄混了!
前端·html
lichong95134 分钟前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端
xu_yule1 小时前
Linux_14(多线程)线程控制+C++多线程
java·开发语言·jvm
烟袅1 小时前
作用域链 × 闭包:三段代码,看懂 JavaScript 的套娃人生
前端·javascript
合作小小程序员小小店1 小时前
网页开发,在线%新版本旅游管理%系统,基于eclipse,html,css,jquery,servlet,jsp,mysql数据库
java·数据库·eclipse·html·intellij-idea·旅游·jsp
风止何安啊1 小时前
收到字节的短信:Trae SOLO上线了?尝尝鲜,浅浅做个音乐播放器
前端·html·trae
组合缺一1 小时前
Spring Boot 国产化替代方案。Solon v3.7.2, v3.6.5, v3.5.9 发布(支持 LTS)
java·后端·spring·ai·web·solon·mcp
抱琴_1 小时前
大屏性能优化终极方案:请求合并+智能缓存双剑合璧
前端·javascript