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

如何将含大写字段名的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:22:56