我正在嘗試實作 JsonSubTypes,但我希望能夠對無法識別的子型別進行一些優雅的處理。我正在使用 Jackson 2.9.7,更新不是一個選項,因為還有一些其他類取決于它。
假設這是我的代碼:
@Value.Style(allParameters = true, typeImmutable = "*", typeImmutableEnclosing = "*Impl",
defaults = @Value.Immutable(builder = false))
@Value.Enclosing
@JsonSerialize
@JsonDeserialize
public class JsonAnimal {
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "subClass", include = JsonTypeInfo.As.EXISTING_PROPERTY,
visible = true, defaultImpl = UnmappedAnimal.class) //fixme create logger warning if this defaults to a Void
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = Dog.ANIMAL_TYPE),
@JsonSubTypes.Type(value = Cat.class, name = Cat.ANIMAL_TYPE),
@JsonSubTypes.Type(value = Fish.class, name = Fish.ANIMAL_TYPE),
@JsonSubTypes.Type(value = Hamster.class,
name = Hamster.ANIMAL_TYPE)
public static abstract class Animal {
public abstract String subClass();
//other code
}
@Value.Immutable
@JsonDeserialize
public abstract static class Dog extends Animal {
public static final String ANIMAL_TYPE = "dog";
//dog-specific code
}
@Value.Immutable
@JsonDeserialize
public abstract static class Cat extends Animal {
public static final String ANIMAL_TYPE = "cat";
//cat-specific code
}
@Value.Immutable
@JsonDeserialize
public abstract static class Fish extends Animal {
public static final String ANIMAL_TYPE = "fish";
//fish-specific code
}
@Value.Immutable
@JsonDeserialize
public abstract static class Hamster extends Animal {
public static final String ANIMAL_TYPE = "hamster";
//hamster-specific code
}
public class UnmappedAnimal extends Animal { /**/ }
我實作了子類,因為 JSON 負載中的“動物”物件將具有不同的欄位,具體取決于“子類”的值,例如,子類“貓”的動物將具有其他子類不會具有的“livesLeft”欄位。
現在假設我有這個 JSON 有效負載進來:
{
"id": 123456,
"animal": {
"subType": "horse",
/* everything else */
}
}
這會導致以下錯誤:
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'horse' as a subtype of [simple type, class my.project.path.apiobject.JsonAnimal$Animal]: known type ids = dog, cat, fish, hamster] (for POJO property 'animal')
我該怎么做才能處理未映射的子型別?我應該catch (InvalidTypeIdException)在決議 JSON 時使用嗎?我會很感激我能得到的任何幫助。
編輯:我還應該問,我的 JSON 決議器的 ObjectMapper 啟用了 ACCEPT_CASE_INSENSITIVE_PROPERTIES 和 FAIL_ON_UNKNOWN_PROPERTIES,但是如果我有一個名為“SubClass”而不是“subClass”的屬性,則不會被決議。
uj5u.com熱心網友回復:
如果您像這樣配置 objectMapper 實作
objectMapper.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
你可以實作優雅的處理。具有不可決議子型別的欄位將被反序列化為 null。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/361636.html
下一篇:JQ在過濾器前添加(靜態)標頭
