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. 使用 @JsonNaming</em/> 註解
接下來,我們可以使用 @JsonNaming</em/> 註解應用於類,並且 所有字段都將使用 snake case 進行反序列化</strong/>:
@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 將蛇形 JSON 轉換為駝峯式字段的不同方法。
首先,我們顯式地命名了字段。然後,我們在 POJO 本身設置了命名策略。
最後,我們向 ObjectMapper 添加了全局配置。