JSON对象中的字段名可以有多种格式。当我们想将它们加载到POJO中时,我们可能会遇到一个问题,即Java代码中的属性名称与JSON中的命名约定不匹配。
在这篇文章中,我们将看到如何使用Jackson将snake-case JSON反序列化为camel-case字段。
安装Jackson
让我们从将Jackson依赖项添加到pom.xml文件:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13</version>
</dependency>
使用默认值反序列化
让我们考虑一个示例用户类:
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中的字段名称精确匹配。
接下来,我们将学习解决此问题的三种方法。
使用@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());
使用@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());
配置ObjectMapper
最后,我们可以在ObjectMapper
上使用SetPropertyNamegStrategy
方法为所有序列化配置它:
ObjectMapper objectMapper = new ObjectMapper()
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
User user = objectMapper.readValue(JSON, User.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
如我们所见,我们现在可以将JSON反序列化到原始用户对象中,即使用户类没有任何注释。
我们应该注意,还有其他命名约定,上述解决方案也适用于它们。
结论
在本文中,我们看到了使用Jackson将snake-case JSON反序列化为camel-case字段的不同方法。
首先,我们明确地命名了字段。然后我们在POJO本身上设置命名策略。
最后,我们向ObjectMapper添加了一个全局配置。
本文中的示例代码可以在GitHub上找到:https://github.com/eugenp/tutorials/tree/master/jackson-modules/jackson-conversions-2