2016年10月1日土曜日

[Jackson]Enumの値を読み書きする

Jacksonを使って、json内の値をEnumとして読み書きする方法。

Jacksoのバージョン

compile 'com.fasterxml.jackson.core:jackson-databind:2.8.3'

jsonにマッピングするオブジェクトの定義

json→Enumの変換は@JsonCreatorアノテーションを設定したstaticメソッドで行う。
Enum→jsonの変換は@JsonValueアノテーションを設定したメソッドで行う。
public class SampleBean {

    private Enum value;

    public Enum getValue() {
        return value;
    }

    public void setValue(final Enum value) {
        this.value = value;
    }
}

enum Enum {
    A(1),
    B(2),
    C(3),;

    private int value;

    Enum(final int value) {
        this.value = value;
    }

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

    @JsonCreator
    public static Enum fromValue(int value) {
        return Arrays.stream(values())
              .filter(v -> v.value == value)
              .findFirst()
              .orElseThrow(() -> new IllegalArgumentException(String.valueOf(value)));
    }
}

jsonの内容

{"value": 2}

json→Beanに実装

final ObjectMapper objectMapper = new ObjectMapper();

final SampleBean bean = objectMapper.readValue("{\"value\": 2}", SampleBean.class);
System.out.println("bean.getValue() = " + bean.getValue());

final String json = objectMapper.writeValueAsString(bean);
System.out.println("json = " + json);

結果

bean.getValue() = B
json = {"value":2}