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


免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表一休教程网的观点和立场。