"com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id" 尝试反序列化子类时
"com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id" when trying to deserialise subclass
我正在尝试实现 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 { /**/ }
我实现了 sub类 因为 JSON 有效负载中的“动物”对象会根据“子类”的值而具有不同的字段,例如子类“cat”的动物将具有其他子类所没有的“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')
我该怎么做才能处理未映射的子类型?我应该在解析 JSON 时只使用 catch (InvalidTypeIdException)
吗?我会很感激我能得到的任何帮助。
编辑:
我还应该问,我的 JSON 解析器的 ObjectMapper 启用了 ACCEPT_CASE_INSENSITIVE_PROPERTIES 和 FAIL_ON_UNKNOWN_PROPERTIES,但是如果我有一个名为“SubClass”而不是“subClass”的 属性,那未被解析。
如果您像这样配置 objectMapper 实现
objectMapper.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
你可以实现优雅的处理。具有不可解析子类型的字段将被反序列化为 null。
我正在尝试实现 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 { /**/ }
我实现了 sub类 因为 JSON 有效负载中的“动物”对象会根据“子类”的值而具有不同的字段,例如子类“cat”的动物将具有其他子类所没有的“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')
我该怎么做才能处理未映射的子类型?我应该在解析 JSON 时只使用 catch (InvalidTypeIdException)
吗?我会很感激我能得到的任何帮助。
编辑: 我还应该问,我的 JSON 解析器的 ObjectMapper 启用了 ACCEPT_CASE_INSENSITIVE_PROPERTIES 和 FAIL_ON_UNKNOWN_PROPERTIES,但是如果我有一个名为“SubClass”而不是“subClass”的 属性,那未被解析。
如果您像这样配置 objectMapper 实现
objectMapper.disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
你可以实现优雅的处理。具有不可解析子类型的字段将被反序列化为 null。