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
最後,我們可以使用 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 中添加了全局配置。