我有这个回应:
{
"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)。此模块的配置如下: 该模块向用户询问动物的每个子类的唯一属性。因此,当反序列