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

REST请求JSON Payload大小写保留问题求助

解决REST请求JSON Payload大小写保留问题(JsonProperty注解无效)

别慌,这种情况我碰到过好多次,大概率是全局序列化配置覆盖了你的@JsonProperty注解,或者是序列化库的配置/注解使用出了问题。下面分几种常见场景给你针对性解决方案:


1. 检查Jackson全局配置是否强制小写

如果用的是Spring Boot(大概率是),默认用Jackson做序列化。如果项目里配置了全局的小写命名策略,会直接覆盖@JsonProperty的自定义设置。

比如你在application.properties/application.yml里加了这类配置:

# 强制所有字段转小写
spring.jackson.property-naming-strategy=LOWER_CASE
# 或者驼峰转下划线的配置(也可能干扰自定义命名)
spring.jackson.property-naming-strategy=SNAKE_CASE

解决思路:

  • 要么删掉这个全局配置,让@JsonProperty注解生效;
  • 要么针对单个实体类单独设置命名策略,用@JsonNaming覆盖全局:
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;

// 用默认策略,让字段上的@JsonProperty优先生效
@JsonNaming(PropertyNamingStrategies.DefaultStrategy.class)
public class YourRequestEntity {
    @JsonProperty("UserName") // 这里的大小写会被严格保留
    private String userName;
    
    // 其他字段...
}

2. 确认@JsonProperty的包导对了

很多人会踩这个坑!Jackson的@JsonProperty是com.fasterxml.jackson.annotation.JsonProperty,不是Gson、JAXB等其他库的同名注解。如果导错了包,注解根本不会起作用。

检查你的实体类:

// 正确的包路径
import com.fasterxml.jackson.annotation.JsonProperty;

public class YourRequestEntity {
    @JsonProperty("UserName")
    private String userName;
}

3. 如果用的是Gson而非Jackson

如果项目用Gson做序列化,@JsonProperty是无效的,得用Gson专属的@SerializedName注解:

import com.google.gson.annotations.SerializedName;

public class YourRequestEntity {
    @SerializedName("UserName")
    private String userName;
}

同时要确保Gson没有全局强制小写的配置,比如创建Gson实例时不要加setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)这类代码。


4. 检查请求发送工具的序列化配置(比如RestTemplate)

如果用Spring的RestTemplate发送请求,默认用Jackson,但如果自定义了消息转换器,可能不小心配置了全局命名策略。比如:

RestTemplate restTemplate = new RestTemplate();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();

// 别加这行!它会强制所有字段转小写,覆盖注解
// objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CASE);

converter.setObjectMapper(objectMapper);
restTemplate.getMessageConverters().add(converter);

把全局命名策略的配置删掉,@JsonProperty就能正常生效了。


5. 极端情况:getter/setter方法干扰序列化

有时候Jackson会根据getter方法的名称生成字段名,而不是直接用字段名。比如字段是userName,但getter写成了getusername()(全小写),Jackson可能会生成username而不是你注解指定的UserName。

解决办法:

  • 确保getter/setter的命名符合规范,或者在字段和getter/setter上都标注@JsonProperty:
@JsonProperty("UserName")
private String userName;

@JsonProperty("UserName")
public String getUserName() {
    return userName;
}

@JsonProperty("UserName")
public void setUserName(String userName) {
    this.userName = userName;
}

试试上面这些方法,应该能解决你的问题。如果还是不行,可以把实体类代码和请求发送的代码贴出来,我再帮你排查~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:25:54