深入理解 @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 的展示格式


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

相关推荐
程序员阿超的博客44 分钟前
React动态渲染:如何用map循环渲染一个列表(List)
前端·react.js·前端框架
magic 2451 小时前
模拟 AJAX 提交 form 表单及请求头设置详解
前端·javascript·ajax
Zephyrtoria1 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法
yuren_xia5 小时前
RabbitMQ 知识详解(Java版)
java·rabbitmq·java-rabbitmq
小小小小宇5 小时前
前端 Service Worker
前端
只喜欢赚钱的棉花没有糖6 小时前
http的缓存问题
前端·javascript·http
kfyty7256 小时前
轻量级 ioc 框架 loveqq,支持接口上传 jar 格式的 starter 启动器并支持热加载其中的 bean
java·jvm·ioc·jar·热加载
小小小小宇6 小时前
请求竞态问题统一封装
前端
loriloy6 小时前
前端资源帖
前端
源码超级联盟6 小时前
display的block和inline-block有什么区别
前端