1. 概要
JSONオブジェクトのフィールド名は、さまざまな形式にすることができます。 それらをPOJOにロードする場合、Javaコードのプロパティ名がJSONの命名規則と一致しないという問題が発生する可能性があります。
この短いチュートリアルでは、Jacksonを使用してスネークケースJSONをキャメルケースフィールドに逆シリアル化する方法を説明します。
2. ジャクソンをインストールする
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をロードしてみましょう。
{
"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。のフィールド名と正確に一致させることはできません。
次に、この問題を解決する3つの方法を学びます。
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アノテーションを使用する
次に、クラスで @JsonNaming アノテーションを使用でき、すべてのフィールドがスネークケースを使用して逆シリアル化されます。
@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());
ご覧のとおり、 User クラスにアノテーションがない場合でも、JSONを元のUserオブジェクトに逆シリアル化できます。
他の命名規則(たとえば、ケバブの場合)があり、上記のソリューションもそれらで機能することに注意してください。
7. 結論
この記事では、Jacksonを使用してスネークケースJSONをキャメルケースフィールドに逆シリアル化するさまざまな方法を見てきました。
まず、フィールドに明示的に名前を付けました。 次に、POJO自体に命名戦略を設定します。
最後に、ObjectMapperにグローバル構成を追加しました。
いつものように、この記事のサンプルコードは、GitHubのにあります。