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

如何让API返回的字段名与Java实体类变量名不一致?

问题原因及解决方案

常见失效原因

  • 注解导包错误:Spring Boot 默认使用 Jackson 做JSON序列化,若你导入了Fastjson、Gson等其他JSON库的字段重命名注解,Jackson不会识别,自然不生效。正确的Jackson @JsonProperty 导包路径为 com.fasterxml.jackson.annotation.JsonProperty
  • 项目配置了非默认的序列化策略:若全局配置了 spring.jackson.property-naming-strategy 等命名转换规则,且规则优先级高于字段注解(部分旧版Jackson存在该问题),会覆盖注解配置
  • 项目使用其他JSON库作为默认序列化器:若你手动配置了Fastjson、Gson等代替默认的Jackson作为HTTP消息转换器,需要使用对应JSON库的重命名注解

实现输入输出字段不一致的方案

方案1:使用Jackson原生注解(推荐,适配默认Jackson环境)

用 @JsonProperty 指定序列化输出的字段名,用 @JsonAlias 指定反序列化(接收请求)可识别的别名,写法最简单:

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Class {
    @JsonProperty("Data") // 序列化返回时输出字段为Data
    @JsonAlias("ClassData") // 反序列化接收时可识别ClassData字段
    List<ClassData> classData;
}

方案2:适配Fastjson环境

如果你的项目配置了Fastjson作为默认序列化器,改用Fastjson的@JSONField注解即可:

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Class {
    // serialize指定序列化输出名,deserializeName指定反序列化接收名
    @JSONField(name = "Data", deserializeName = "ClassData")
    List<ClassData> classData;
}

验证方法

可通过本地单元测试快速验证序列化/反序列化是否符合预期,排除框架配置影响:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;

public class JsonTest {
    @Test
    void testJson() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        // 测试序列化输出
        Class clazz = new Class();
        clazz.setClassData(List.of());
        String outputJson = mapper.writeValueAsString(clazz);
        System.out.println(outputJson); // 预期输出:{"Data":[]}

        // 测试反序列化接收
        String inputJson = "{\"ClassData\":[]}";
        Class inputClazz = mapper.readValue(inputJson, Class.class);
        System.out.println(inputClazz.getClassData() != null); // 预期输出true
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:39:02