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を構成します

最後に、ObjectMappersetPropertyNamingStrategyメソッドを使用して、すべてのシリアル化用に構成できます。

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にあります。