如何让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
相关产品推荐
相关产品推荐

