Jackson 蛇形命名轉換為駝峯命名

Jackson
Remote
1
08:59 PM · Nov 30 ,2025

1. 概述

JSON 對象中的字段名稱可以採用多種格式。當我們想要將它們加載到我們的 POJO 中時,可能會遇到一個問題,即 Java 代碼中的屬性名稱與 JSON 中的命名約定不匹配。

在本教程中,我們將學習如何使用 Jackson 將蛇形命名 JSON 轉換為駝峯命名字段。

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. 使用 註解

接下來,我們可以使用 註解在類上,所有字段將使用 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

最後,我們可以使用 ObjectMappersetPropertyNamingStrategy 方法來配置它,以進行所有序列化的配置:

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 將蛇形 JSON 轉換為駝峯式字段的不同方法。

首先,我們明確地命名了字段。然後,我們在 POJO 本身設置了命名策略。

最後,我們在 ObjectMapper 中添加了全局配置。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.