当前位置: 首页 > 面试题库 >

杰克逊-@JsonTypeInfo属性被映射为null?

费学
2023-03-14
问题内容

我有这个回应:

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

然后,我要基于 exercise_type 属性实例化不同的对象实例(的子类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

问题在于,由于某种原因,用作属性on 的 exercise_type 属性@JsonTypeInfo被映射为 null 。知道我该如何解决吗?


问题答案:

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

关于类型标识符可见性的注意事项:默认情况下,类型标识符的反序列化(在读取JSON时使用)完全由Jackson进行处理,并且不会传递给反序列化器。但是,如果需要,可以定义属性visible
= true,在这种情况下,属性将在反序列化时按原样传递给解串器(并通过setter或field进行设置)。

因此,解决方案只是添加“ visible ”属性,如下所示

@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  
{}

希望这对其他人有帮助。



 类似资料:
  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 问题内容: 我正在研究一个简单的示例,该示例用于将字符串转换回,但是我看到在Java对象上设置的属性很少,而不是所有属性。 这是我的代码: Sample.java程序如下所示: 在我的文件中输入json字符串是: 该程序的输出为: 根据我的程序,and 不应为null。我不清楚我在哪里犯错。 更新: 如果删除注释,则会出现如下异常: 这是我的pom.xml文件依赖项: 问题答案: 您在评论中说,您

  • 问题内容: 在jackson中使用的@JsonTypeInfo和@JsonSubTypes注释是什么? ======================================= ============================================== 我了解的是 ,它还保留了要序列化的对象的具体类型以及实际数据。 我不清楚 反序列化期间的实际优势/收益是什么。 除了Jav

  • 我已经发布了类似的东西,但我仍然试图集中在我的问题上。 谢谢你能容忍我。 com.fasterxml.jackson.databind.jsonMappingException:无法构造FHIR.Element的实例,问题:抽象类型要么需要映射到具体类型,有自定义的反序列化器,要么需要在com.fasterxml.jackson.databind.jsonMappingException.from

  • 我需要在序列化时动态过滤bean属性。 不是我的选择。 假设我的Bean(作为Json符号): 我想使用以下属性编写 JSON: 预期的 JSON 结果为: 最后,我将在RestController中创建一个注释(),用于Spring,如下所示:

  • 我目前正在尝试使用能够处理多态性的jackson实现反序列化程序,也就是说,给定这两个类: 反序列化器应该能够从json字符串推断和实例化正确的子类。 我使用自定义解串器模块,即唯一属性多态态序列化器(从 https://gist.github.com/robinhowlett/ce45e575197060b8392d)。此模块的配置如下: 该模块向用户询问动物的每个子类的唯一属性。因此,当反序列