java的typeinfo_java-将@JsonTypeInfo属性设为可选

我正在使用@JsonTypeInfo来指示Jackson在@class属性中查找具体类型信息.但是,有时我不想指定@class,尤其是在可以根据上下文推断出子类型的情况下.最好的方法是什么?

这是JSON的示例:

{

"owner": {"name":"Dave"},

"residents":[

{"@class":"jacksonquestion.Dog","breed":"Greyhound"},

{"@class":"jacksonquestion.Human","name":"Cheryl"},

{"@class":"jacksonquestion.Human","name":"Timothy"}

]

}

并且我正在尝试将它们反序列化为这些类(全部在jacksonquestion.*中):

public class Household {

private Human owner;

private List residents;

public Human getOwner() { return owner; }

public void setOwner(Human owner) { this.owner = owner; }

public List getResidents() { return residents; }

public void setResidents(List residents) { this.residents = residents; }

}

public class Animal {}

public class Dog extends Animal {

private String breed;

public String getBreed() { return breed; }

public void setBreed(String breed) { this.breed = breed; }

}

public class Human extends Animal {

private String name;

public String getName() { return name; }

public void setName(String name) { this.name = name; }

}

使用此配置:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")

private static class AnimalMixin {

}

//...

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.getDeserializationConfig().addMixInAnnotations(Animal.class, AnimalMixin.class);

Household household = objectMapper.readValue(json, Household.class);

System.out.println(household);

如您所见,所有者被声明为人类,而不是动物,因此我希望能够省略@class并让Jackson像通常那样推断类型.

当我运行这个时,我得到

org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT),

expected FIELD_NAME: missing property '@class' that is to contain type id (for class jacksonquestion.Human)

由于“所有者”未指定@class.

有任何想法吗?我最初的想法是在属性而不是类型上使用@JsonTypeInfo.但是,这不能用于注释列表的元素类型. (不正确,请参见答案)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值