gpt4 book ai didi

java - Jackson:在不提供 id 的情况下无法明确指示多态性中的目标类?

转载 作者:行者123 更新时间:2023-12-02 02:46:50 26 4
gpt4 key购买 nike

我正在尝试使用 Jackson 读取 JSON,其中目标类是已正确注释的抽象的子类。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,  include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = SubClass1.class, name = "sub1"),
@JsonSubTypes.Type(value = SubClass2.class, name = "sub2"),
@JsonSubTypes.Type(value = SubClass3.class, name = "sub3")
})
public abstract class SuperClass {

}

public class SubClass1 extends SuperClass {}
public class SubClass2 extends SuperClass {}
public class SubClass3 extends SuperClass {}

当我读到这样的内容时,这一切都很好,很漂亮:

objectMapper.readValue("{\"type\":\"sub1\"}", SuperClass.class);

这将按预期创建一个新的 SubClass1

但是,当我尝试显式提供预期的类(并省略 JSON 中的类型时:

objectMapper.readValue("{}", SubClass1.class);

我遇到异常:

Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type' that is to contain type id (for class com.test.SubClass1) at [Source: N/A; line: -1, column: -1]

当我显式提供类型作为第二个参数时,为什么仍然需要提供类型?作为旁注,如果我确实提供了(正确的)类型,它就可以工作,但是如果我提供了错误的类型,比如说......

objectMapper.readValue("{\"type\":\"sub2\", SubClass1.class);

Class com.test.SubClass2 is not assignable to com.test.SubClass1

这是有道理的,但为什么我需要提供类型值(显然它只需要一个特定值)

最佳答案

您需要注册新的DeserializationProblemHandler并返回baseType:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
import java.io.IOException;

public class JsonApp {

public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addHandler(
new DeserializationProblemHandler() {
@Override
public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) {
return baseType;
}
});

System.out.println(objectMapper.readValue("{}", SubClass1.class));
System.out.println(objectMapper.readValue("{}", SubClass2.class));
System.out.println(objectMapper.readValue("{}", SubClass3.class));
}
}

上面的代码将打印 3 个给定类型的对象。

关于java - Jackson:在不提供 id 的情况下无法明确指示多态性中的目标类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57138154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com