【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());
}
}
これで互換的なデシリアライズが可能だ!
是非フォローしてください
最新の情報をお伝えします