将 Snake Case 反序列化为 Camel Case 使用 Jackson
最后更新:2021年11月3日
1. 概述
JSON 对象中的字段名称可以使用多种格式。当我们想将它们加载到我们的 POJO 中时,可能会遇到一个问题,即 Java 代码中的属性名称与 JSON 中的命名约定不匹配。
在本简短的教程中,我们将看到如何使用 Jackson 将 snake case JSON 反序列化为 camel case 字段。
2. 安装 Jackson
让我们从将 Jackson 依赖 添加到我们的 pom.xml 文件开始
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13</version>
</dependency>
3. 使用默认值进行反序列化
让我们考虑一个例子 User 类
public class User {
private String firstName;
private String lastName;
// standard getters and setters
}
让我们尝试加载这个 JSON,它使用 Snake Case 命名标准(小写名称用 _ 分隔)
{
"first_name": "Jackie",
"last_name": "Chan"
}
首先,我们需要使用 ObjectMapper 来反序列化这个 JSON
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(JSON, User.class);
但是,当我们尝试这样做时,我们会得到一个错误
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "first_name" (class com.baeldung.jackson.snakecase.User), not marked as ignorable (2 known properties: "lastName", "firstName"])
不幸的是,Jackson 无法完全将 JSON 中的名称与 User 中的字段名称匹配。
接下来,我们将学习三种解决这个问题的方法。
4. 使用 @JsonProperty 注解
我们可以使用 @JsonProperty 注解在类的字段上,将字段映射到 JSON 中的确切名称
public class UserWithPropertyNames {
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
// standard getters and setters
}
现在我们可以将我们的 JSON 反序列化为 UserWithPropertyNames
ObjectMapper objectMapper = new ObjectMapper();
UserWithPropertyNames user = objectMapper.readValue(JSON, UserWithPropertyNames.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
5. 使用 @JsonNaming 注解
接下来,我们可以使用 @JsonNaming 注解在类上,并且 所有字段都将使用 snake case 反序列化
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class UserWithSnakeStrategy {
private String firstName;
private String lastName;
// standard getters and setters
}
然后再次反序列化我们的 JSON
ObjectMapper objectMapper = new ObjectMapper();
UserWithSnakeStrategy user = objectMapper.readValue(JSON, UserWithSnakeStrategy.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
6. 配置 ObjectMapper
最后,我们可以使用 ObjectMapper 上的 setPropertyNamingStrategy 方法来配置所有序列化
ObjectMapper objectMapper = new ObjectMapper()
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
User user = objectMapper.readValue(JSON, User.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
正如我们所见,我们现在可以将我们的 JSON 反序列化到原始的 User 对象,即使 User 类没有任何注释。
我们应该注意到,还有其他的命名约定(例如 kebab case),并且上述解决方案也适用于它们。
7. 结论
在本文中,我们已经 看到了使用 Jackson 将 snake case JSON 反序列化为 camel case 字段的不同方法。
首先,我们显式命名了字段。然后我们设置了 POJO 本身的命名策略。
最后,我们向 ObjectMapper 添加了一个全局配置。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















