【Java】互換的なデシリアライズをしたい!それならカスタムデシリアイズだ!

こんな感じで実装可能が、「parameter」にboolean型の値が来ようが、「BooleanEnum」が来ようが適切に変換できるよ!

オブジェクトとENUMを用意

■ BooleanEnum

public enum BooleanEnum {
    TRUE("1"),
    FALSE("0");

    private final String value;

    BooleanEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public static BooleanEnum fromBoolean(boolean bool) {
        return bool ? TRUE : FALSE;
    }

    public static BooleanEnum fromValue(String value) {
        for (BooleanEnum enumValue : BooleanEnum.values()) {
            if (enumValue.getValue().equals(value)) {
                return enumValue;
            }
        }
        throw new IllegalArgumentException("Unknown value: " + value);
    }

    public static BooleanEnum fromName(String name) {
        try {
            return BooleanEnum.valueOf(name);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("Unknown name: " + name);
        }
    }
}

■ オブジェクト

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

public class Object {
    @JsonDeserialize(using = BooleanEnumDeserializer.class)
    private BooleanEnum parameter;

    private boolean otherParameter;

    public BooleanEnum getParameter() {
        return parameter;
    }

    public void setParameter(BooleanEnum parameter) {
        this.parameter = parameter;
    }

    public boolean getOtherParameter() {
        return otherParameter;
    }

    public void setOtherParameter(boolean otherParameter) {
        this.otherParameter = otherParameter;
    }
}

カスタムデシリアライザの作成

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class BooleanEnumDeserializer extends JsonDeserializer<BooleanEnum> {

    @Override
    public BooleanEnum deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        if (p.getCurrentToken().isBoolean()) {
            return BooleanEnum.fromBoolean(p.getBooleanValue());
        } else if (p.getCurrentToken().isTextual()) {
            String text = p.getText();
            if (text.equals("1") || text.equals("0")) {
                return BooleanEnum.fromValue(text);
            } else {
                return BooleanEnum.fromName(text);
            }
        }
        throw new IllegalArgumentException("Unexpected token: " + p.getCurrentToken());
    }
}

これで互換的なデシリアライズが可能だ!

是非フォローしてください

最新の情報をお伝えします