Jackson -@JsonTypeInfo 属性被映射为 null?

我的回答是:

{
"id":"decaa828741611e58bcffeff819cdc9f",
"statement":"question statement",
"exercise_type":"QUESTION"
}

然后,基于 练习 _ 类型属性,我想实例化不同的对象实例(ExerciseResponseDTO的子类) ,所以我在以下内容中创建了这个组合:

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "exercise_type")
@JsonSubTypes({
@Type(value = ExerciseChoiceResponseDTO.class, name = "CHOICE"),
@Type(value = ExerciseQuestionResponseDTO.class, name = "QUESTION")})
public abstract class ExerciseMixIn
{}


public abstract class ExerciseResponseDTO {


private String id;
private String statement;
@JsonProperty(value = "exercise_type") private String exerciseType;


// Getters and setters
}


public class ExerciseQuestionResponseDTO
extends ExerciseResponseDTO {}


public class ExerciseChoiceResponseDTO
extends ExerciseResponseDTO {}

因此,我创建我的 ObjectMapper如下所示

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(ExerciseResponseDTO.class, ExerciseMixIn.class);

我的测试:

ExerciseResponseDTO exercise = mapper.readValue(serviceResponse, ExerciseResponseDTO.class)
Assert.assertTrue(exercise.getClass() == ExerciseQuestionResponseDTO.class); // OK
Assert.assertEquals("decaa828741611e58bcffeff819cdc9f" exercise.getId()); // OK
Assert.assertEquals("question statement", exercise.getStatement()); // OK
Assert.assertEquals("QUESTION", exercise.getExerciseType()); // FAIL. Expected: "QUESTION", actual: null

问题是,由于某种原因,在 @JsonTypeInfo上作为属性使用的 练习 _ 类型属性被映射为 无效。 知道我该怎么解决吗?

37779 次浏览

最后,我在 API 文件中找到了解决方案

关于类型标识符可见性的注意事项: 默认情况下,反序列化 (在读取 JSON 时使用)的类型标识符完全处理 并且没有传递给反序列化器。但是,如果是这样的话 如果需要,则可以定义可见属性 = true,其中 Case 属性将按原样传递给反序列化器(并通过 关于反序列化。

因此,解决方案只是简单地添加‘ 看得见’属性,如下所示

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "exercise_type",
visible = true)
@JsonSubTypes({
@Type(value = ExerciseChoiceResponseDTO.class, name = "CHOICE"),
@Type(value = ExerciseQuestionResponseDTO.class, name = "QUESTION")})
public abstract class ExerciseMixIn
{}

希望这能帮到别人。

根据 @ jscherman answer的设置,JsonTypeInfo 中的“ visible”true 将有助于作为字段访问 training _ type。

如果您也使用相同的类来序列化,那么生成的 JSON 将会出现两次 work _ type。因此,最好也更新包括到 存在 _ 属性

所有其他选择也值得一看,因为它包括。