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上找到。