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

Spring中VO属性JSON序列化大小写异常及重复字段问题求助

问题描述

在Spring项目中定义了如下VO作为响应体:

@Data
public class VO {
    private Legend legend = new Legend();
    private XAxis xAxis = new XAxis();
    private YAxis yAxis = new YAxis();
}

返回的JSON中属性被自动转为全小写:

{
  "legend": "...",
  "xaxis": "...",
  "yaxis": "..."
}

为了保留驼峰命名,给字段添加@JsonProperty注解修改VO:

@Data
public class VO {
    private Legend legend = new Legend();
    @JsonProperty("xAxis")
    private XAxis xAxis = new XAxis();
    @JsonProperty("yAxis")
    private YAxis yAxis = new YAxis();
}

但修改后返回的JSON中xAxis出现两个字段,yAxis仅出现一个:

{
  "legend": "...",
  "xaxis": "...",
  "xAxis": "...",
  "yAxis": "..."
}
原因分析
  1. 全局命名策略与注解冲突:你的项目中大概率配置了全局JSON字段命名策略(比如强制将所有字段转为全小写),Jackson会根据Lombok生成的getter方法(如getXAxis()),按照全局策略生成xaxis字段。
  2. 双重序列化触发:添加@JsonProperty("xAxis")后,相当于强制指定了一个驼峰命名的字段,此时Jackson同时处理了两个来源的字段:一个是全局策略解析getter生成的xaxis,另一个是注解指定字段生成的xAxis,导致重复。
  3. yAxis无重复的临时原因:大概率是缓存或序列化上下文的临时问题(比如首次修改后未完全重启,yAxis的getter未被全局策略重新解析),本质上如果不解决根因,yAxis也可能出现同样问题。
解决方案

方案1:统一全局命名策略(推荐)

修改Spring的Jackson配置,将全局命名策略设置为驼峰命名,这样无需添加@JsonProperty即可自动生成xAxis、yAxis格式的字段:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 设置驼峰命名策略
        objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
        return objectMapper;
    }
}

或者在application.yml中配置:

spring:
  jackson:
    property-naming-strategy: LOWER_CAMEL_CASE

方案2:用类级注解覆盖命名策略

如果不想修改全局配置,可以在VO类上添加@JsonNaming注解,指定当前类使用驼峰命名:

@Data
@JsonNaming(PropertyNamingStrategy.LOWER_CAMEL_CASE.class)
public class VO {
    private Legend legend = new Legend();
    private XAxis xAxis = new XAxis();
    private YAxis yAxis = new YAxis();
}

方案3:限制Jackson仅序列化字段

通过@JsonAutoDetect注解让Jackson只通过字段(而非getter方法)进行序列化,避免全局策略解析getter生成重复字段:

@Data
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, 
                getterVisibility = JsonAutoDetect.Visibility.NONE)
public class VO {
    private Legend legend = new Legend();
    @JsonProperty("xAxis")
    private XAxis xAxis = new XAxis();
    @JsonProperty("yAxis")
    private YAxis yAxis = new YAxis();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:15:08