あなたの列挙型のすべてがUNKNOWN
値を持っている場合、あなたはこのような1つのカスタムデシリアライザ書くことができます。
class EnumDeserializer extends JsonDeserializer<Enum> {
private final Class<? extends Enum> enumType;
public EnumDeserializer(Class<? extends Enum> enumType) {
this.enumType = enumType;
}
@Override
public Enum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
try {
String stringValue = jp.getValueAsString().toUpperCase();
return Enum.valueOf(enumType, stringValue.toUpperCase());
} catch (IllegalArgumentException e) {
return Enum.valueOf(enumType, "UNKNOWN");
}
}
}
をし、ユーザそれにあなたのマッパーを設定します。
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<Enum> modifyEnumDeserializer(DeserializationConfig config,
final JavaType type,
BeanDescription beanDesc,
final JsonDeserializer<?> deserializer) {
return new EnumDeserializer((Class<Enum<?>>) type.getRawClass());
}
});
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
代わりにあなたはジャクソンのデシリアライズを使用することができます未知の列挙型プロパティのデフォルト値を設定する機能:
enum MyEnum { A, B, @JsonEnumDefaultValue UNKNOWN }
...
final ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
MyEnum value = mapper.readValue("\"foo\"", MyEnum.class);
assertSame(MyEnum.UNKNOWN, value);
しかし、このような方法では、すべての列挙型をデフォルト値の@JsonEnumDefaultValue
注釈を使用するように変更する必要があります。また、デフォルトでは小文字の列挙型の値は処理されません。
この質問をどのように把握できますか?私は2日間、jackson-databindのソースコードをトレースしようとしましたが、何も見つけませんでした.... – LoveTW