1. 概述

JSON对象中的字段名可以有多种格式。当我们想要将它们加载到我们的POJO(Plain Old Java Object,简单的Java对象)中时,可能会遇到一个问题:Java代码中的属性名称与JSON中的命名规范不匹配。

在这个简短教程中,我们将学习如何使用Jackson 将蛇形命名(小写字母,用下划线分隔)的JSON转换为驼峰命名(首字母大写)的字段。

2. 安装Jackson

首先,我们在pom.xml文件中添加Jackson依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

3. 使用默认方式反序列化

考虑一个名为User的类示例:

public class User {
    private String firstName;
    private String lastName;
    // ...
}

现在尝试加载使用蛇形命名标准(小写名字,用下划线分隔)的JSON:

{
    "first_name": "John",
    "last_name": "Doe"
}

首先,我们需要使用ObjectMapper来反序列化这个JSON:

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);

但是,当我们尝试这样做时,会收到一个错误:

JsonMappingException: Can not find setter for 'first_name' to inject value into property 'firstName'

遗憾的是,Jackson无法精确地将JSON中的名称映射到User类的字段上。

接下来,我们将学习三种解决此问题的方法。

4. 使用@JsonProperty注解

我们可以在类的字段上使用@JsonProperty注解来精确地将字段映射到JSON中的确切名称:

public class UserWithPropertyNames {
    @JsonProperty("first_name")
    private String firstName;

    @JsonProperty("last_name")
    private String lastName;
    // ...
}

现在我们可以将JSON反序列化为UserWithPropertyNames

UserWithPropertyNames deserializedUser = mapper.readValue(json, UserWithPropertyNames.class);

5. 使用@JsonNaming注解

接着,我们可以在类上使用@JsonNaming注解,这样所有字段都将使用蛇形命名进行反序列化:

@JsonNaming(CamelCaseStrategy.class)
public class UserCamelCase {
    private String firstName;
    private String lastName;
    // ...
}

然后再次反序列化JSON:

UserCamelCase deserializedUserCamelCase = mapper.readValue(json, UserCamelCase.class);

6. 配置ObjectMapper

最后,我们可以在ObjectMapper上使用setPropertyNamingStrategy方法来配置全局序列化设置:

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
User user = mapper.readValue(json, User.class);

现在,即使User类没有注解,我们也可以将JSON反序列化为原始的User对象。

需要注意的是,还有其他命名约定(如kebab-case),上述解决方案同样适用于这些情况。

7. 总结

在这篇文章中,我们已经了解了使用Jackson将蛇形命名的JSON转换为驼峰命名字段的不同方法

首先,我们显式地命名了字段。然后在POJO自身上设置了命名策略。

最后,我们在ObjectMapper上添加了全局配置。

如往常一样,本文的示例代码可以在GitHub上找到。