如何将含大写字段名的JSON转换为Java对象?
JSON转Java对象的属性匹配问题
给定JSON数据:
{ "Person": { "PersonId": 122, "Name": "John", "Surname": "Doe", "age": 2 } }
需要转换为以下Java类的对象(无法修改该类):
public class Person { private String personId; private String name; private String surname; private int age; // getters, setters... }
已尝试以下代码但无效:
@Bean ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(new LowerCaseStrategy()); return mapper; } public static class LowerCaseStrategy extends PropertyNamingStrategy.PropertyNamingStrategyBase { @Override public String translate(String input) { char[] chars = input.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); } }
解决方案
方法1:解析JSON树提取内层对象+内置命名策略
自定义策略无效的核心原因是没处理外层Person根节点,且Jackson已有现成的首字母小写转换策略,无需手动实现。代码修改如下:
@Bean ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 内置策略自动将JSON大驼峰键转为Java小驼峰属性 mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE); return mapper; } // 转换逻辑 public Person convertJsonToPerson(String json) throws IOException { ObjectMapper mapper = objectMapper(); // 解析JSON树,提取内层Person节点 JsonNode rootNode = mapper.readTree(json); JsonNode personNode = rootNode.get("Person"); // 将节点转为Person对象 return mapper.treeToValue(personNode, Person.class); }
方法2:启用根节点解包+动态注解(MixIn)
如果不想手动提取节点,可启用Jackson根节点解包功能,通过MixIn为Person类动态添加根节点映射注解:
@Bean ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE); // 启用根节点解包 mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); // 动态为Person类添加@JsonRootName注解 mapper.addMixIn(Person.class, PersonRootNameMixIn.class); return mapper; } // 定义MixIn类,仅用于动态注入注解 abstract class PersonRootNameMixIn { @JsonRootName("Person") private String dummy; } // 转换逻辑 public Person convertJsonToPerson(String json) throws IOException { return objectMapper().readValue(json, Person.class); }
说明
PropertyNamingStrategy.LOWER_CAMEL_CASE会自动完成PersonId→personId、Name→name、Surname→surname的映射,age因格式匹配可直接对应。- 两种方案均无需修改
Person类,满足权限限制要求。
内容的提问来源于stack exchange,提问作者Zhazgul
相关产品推荐
相关产品推荐

