2
0

More than 1 year has passed since last update.

Jacksonでenumをシリアライズ/デシリアライズするときの注意点

Last updated at Posted at 2021-12-14

2.11以降では、enum(列挙型)の変換に@JsonCreatorは必ずしも必要ではなくなった

下記のようにenumに独自の値を持たせているのであれば、そのフィールドに@JsonValueをつければシリアライズ、デシアライズともに取り計らってくれるようになったようです。

TestEnum.java
public enum TestEnum {
    TEST_A("testA"),TEST_B("testB");

    TestEnum(String label) {
        this.label = label;
    }

    @JsonValue
    @Getter
    private String label;

    // このメソッドに@JsonCreatorは不要
    public static TestEnum of(String label) {
        for (var instance : values()) {
            if (instance.label.contentEquals(label))
                return instance;
        }
        throw new IllegalArgumentException();
    }

}

下記のような列挙子のみの場合は、@JsonCreator(mode = Mode.DELEGATING)をつけるように、と説明があります。

TestEnum2.java
public enum TestEnum2 {
    TEST_A,TEST_B;

    @JsonCreator(mode = Mode.DELEGATING)
    public static TestEnum2 of(String name) {
        for (var instance : values()) {
            if (instance.name().contentEquals(name))
                return instance;
        }
        throw new IllegalArgumentException();
    }

}

enumに対して@JsonCreatorをmode=Mode.DEFAULTで使用すると"Input mismatch reading enum"というエラーメッセージを受け取ってしまいます。内部の型推測のルールが変更されたことが原因のようです。@JsonCreatorの引数に@JsonPropertyを使用する場合は、明示的にmode=Mode.PROPERTIESを指定する必要があるようです。

また、不変オブジェクトのデシアライズに関しては、下記も参考になると思います。
https://www.baeldung.com/jackson-deserialize-immutable-objects

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0