使用Jackson序列化含query属性的对象时属性未生成问题咨询
问题原因
该问题由Jackson默认的属性识别规则导致:
- Jackson默认优先扫描符合JavaBean规范的公共Getter/Setter方法推导序列化属性,而非直接读取私有字段
- 原字段
query没有匹配的getQuery()/setQuery()方法时,Jackson会直接忽略该属性 - 字段改为
Query后,自动/手动生成的Getter方法为getQuery(),符合JavaBean命名规则,因此可以被识别,但方法名推导的属性名为大写开头的Query - 字段上的
@JsonProperty不生效是因为Jackson默认优先采用Getter方法推导的属性名,字段注解优先级更低
解决方案
方案1:标准JavaBean写法+注解加在Getter上
先把字段改回符合小驼峰规范的小写开头,在对应Getter方法上加@JsonProperty指定序列化名称:
public class ParameterDef { private String type; private String title; private String description; private Map<String, String> query; @JsonProperty("query") public Map<String, String> getQuery() { return query; } public void setQuery(Map<String, String> query) { this.query = query; } // 其他属性的Getter/Setter省略 }
方案2:配置Jackson优先读取字段
直接修改ObjectMapper配置,让Jackson优先读取字段值,忽略Getter/Setter推导的属性名,字段名称是什么就序列化为什么key:
ObjectMapper objectMapper = new ObjectMapper(); // 允许扫描所有字段(包括私有) objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); // 禁用Getter/Setter的属性扫描 objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); objectMapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
如果是SpringBoot项目,可直接在application.yml中全局配置:
spring: jackson: visibility: field: any getter: none setter: none
排查兜底
如果配置后依然不显示query字段,检查该字段是否被赋值为null:Jackson默认不序列化null值属性,如需序列化null值可添加配置:
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

