Jackson: 列挙値を整数としてシリアル化およびデシリアル化する 質問する

Jackson: 列挙値を整数としてシリアル化およびデシリアル化する 質問する

次の列挙型とクラスを検討してください。

public enum State {
    OFF,
    ON,
    UNKNOWN
}

public class Machine {
    String name;
    int numCores;
    State state;

    public Machine(String name, int numCores, State state) {
        this.name = name;
        this.numCores = numCores;
        this.state = state;
    }
}

次の主な関数を考えてみましょう。

public static void main(String args[]) {
    Machine m = new Machine("Machine 1", 8, State.OFF);
    ObjectMapper mapper = new ObjectMapper();
    String machineAsJsonString = mapper.writeValueAsString(m);
    System.out.println(machineAsJsonString);
}

現在、この main の出力は次のとおりです。

{"name" : "Machine 1", "numCores" : 8, "state" : "OFF"}

"OFF"この出力は私にとっては適切ではありません。の文字列ではなく、列挙型の の序数値である がstate望ましいからです。0OFFState

私が実際に得たい結果は次のとおりです。

{"name" : "Machine 1", "numCores" : 8, "state" : 0}

このように動作させるためのエレガントな方法はあるでしょうか?

ベストアンサー1

マッパーを指定することで動作するはずですJsonValue

public enum State {
    OFF,
    ON,
    UNKNOWN;

    @JsonValue
    public int toValue() {
        return ordinal();
    }
}  

@JsonValueこれは、アノテーションの Javadoc に記載されているように、デシリアライズにも機能します。

注: Java 列挙型に使用する場合、注釈付きメソッドによって返される値は、シリアル化する JSON 文字列だけでなく、デシリアライズ元となる値としても考慮されるという追加機能があります。これは、列挙値のセットが定数であり、マッピングを定義できるため可能ですが、一般に POJO 型では実行できません。そのため、これは POJO デシリアライズには使用されません。

おすすめ記事