如何重写Jackson ObjectMapper适配首字母大写属性的Getter/Setter映射
解决Jackson映射首字母大写字段与JSON键的问题
不用重写Jackson解析器逻辑,直接通过配置命名策略就能解决这个问题,以下是具体方案:
核心问题原因
Jackson默认采用LOWER_CAMEL_CASE命名策略,会把JSON中的Field1自动转为field1,去匹配POJO中对应属性名(或getter/setter推断的属性名)。但你的Avro生成POJO的getter/setter是getField1/setField1,默认推断的属性名是field1,和JSON的Field1不匹配,导致映射失败。
解决方案:配置全局命名策略
直接修改ObjectMapper的命名策略为UPPER_CAMEL_CASE,让Jackson直接用JSON键名(首字母大写)匹配POJO中getter/setter对应的属性名:
Jackson 2.12+ 版本代码
String json = "{\"Field1\":\"Value1\",\"Field2\":\"Value2\",\"Field3\":\"Value3\"}"; ObjectMapper objectMapper = new ObjectMapper(); // 设置命名策略为大驼峰(首字母大写) objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE); Sample sample = objectMapper.readValue(json, Sample.class);
旧版本Jackson(2.11及以下)代码
String json = "{\"Field1\":\"Value1\",\"Field2\":\"Value2\",\"Field3\":\"Value3\"}"; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE); Sample sample = objectMapper.readValue(json, Sample.class);
局部配置(可选)
如果不想全局修改命名策略,也可以给Avro生成的POJO类添加@JsonNaming注解(需确保可修改生成类,或在Avro Schema中配置生成注解):
@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) public class Sample { // 原POJO字段与getter/setter }
效果验证
配置完成后,传入首字母大写的JSON字符串,Jackson会自动将Field1匹配到getField1/setField1对应的属性,无需手动修改JSON键名或POJO结构。
内容的提问来源于stack exchange,提问作者Deepak Kumar
相关产品推荐
相关产品推荐

