Java Jackson能否使用它没有使用的布尔JSON属性反序列化到具体的子类';你不会写吗?

Java Jackson能否使用它没有使用的布尔JSON属性反序列化到具体的子类';你不会写吗?,java,json,jackson,polymorphism,deserialization,Java,Json,Jackson,Polymorphism,Deserialization,我使用Jackson来反序列化从其他地方收到的JSON文件——也就是说,我可以控制反序列化,但不能控制序列化 假设JSON描述了一个简单的列表,其中混合了水生动物和陆生动物 动物JSON属性之一是布尔值isAquatic。在Java中,AquaticAnimal和LandAnimal是独立的类,抽象类Animal的每个子类都包含与两个动物亚型相关的成员数据。动物没有其他亚类,也永远不会有。水生动物的鳃等属性对陆地动物来说毫无意义(因此陆地动物在JSON中永远不会有这样的属性,子类提供了相关的行为

我使用Jackson来反序列化从其他地方收到的JSON文件——也就是说,我可以控制反序列化,但不能控制序列化

假设JSON描述了一个简单的列表,其中混合了水生动物和陆生动物

动物JSON属性之一是布尔值
isAquatic
。在Java中,
AquaticAnimal
LandAnimal
是独立的类,抽象类
Animal
的每个子类都包含与两个动物亚型相关的成员数据。动物没有其他亚类,也永远不会有。水生动物的鳃等属性对
陆地动物
来说毫无意义(因此
陆地动物
在JSON中永远不会有这样的属性,子类提供了相关的行为)。同样,陆生动物也是如此,它们可能有爪子、肺等(这不是一个完美的例子,但它有它的作用)

反序列化时,我希望在执行以下操作时使用
isAquatic
的值来决定使用哪个子类:

Animal-Animal=mapper.readValue(…,Animal.class);
所有处理多态性的例子都涉及到在用Jackson序列化JSON时向JSON中写入额外的数据,但我只读取数据,所以我不能轻松做到这一点。但是,我可以根据JSON中已有的信息确定正确的类,所以我想这样做

我不完全理解Jackson标签,但基于其他示例,我希望能够做到以下几点:

@JsonSubTypes({
@JsonSubTypes.Type(值=LandAnimal.class,isAquatic=false),
@JsonSubTypes.Type(value=AquaticAnimal.class,isAquatic=true)}
)
公共抽象类动物{
...
我肯定这不是注释的使用方式,但希望它能解释我的意图


有人能告诉我杰克逊是否能做到这一点吗?如果是的话,怎么做到的?

有一些漂亮的手巧的符号工作是可能的:

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "isAquatic")
@JsonSubTypes({
    @JsonSubTypes.Type(value = LandAnimal.class, name = "false"),
    @JsonSubTypes.Type(value = AquaticAnimal.class, name = "true") 
})
public abstract class Animal {
    private String isAquatic;
    ...
这将获取属性
isAquatic
,并将其映射到json类型字段
name
,然后根据名称返回适当的类


注意:我只对字符串字段使用过这种方法,因此我将
isAquatic
设置为字符串的原因是,您可以尝试其他方法,看看它是否适用于布尔值。

这闻起来像是一项自定义任务deserialiser@JonK:可能。如果我提供一个
newObjectMapper()
反序列化到的正确子类,对于这两个子类都可以正常工作(构造函数及其参数具有适当的注释)。唯一的问题是Jackson无法确定要构造哪一个。因为有一些Jackson仅使用JSON中的注释和信息进行构造的示例,我想知道该解决方案是否适合我的情况,这似乎比编写自定义反序列化器更简洁。@M\M您是对的,Jackson有可能计算f字段值确定从json对象创建什么类。请参阅下面的答案好消息:当属性(字段)是
boolean
而不是
String
:引号不会引起任何问题。唯一的问题是我的Java基类有名为
void setasquatic(boolean)的方法
布尔isAquatic()
,Jackson将其解释为分别对应于属性
asAquatic
aquatic
。JSON输入包含
“isAquatic”:true
,因此我只需要用
@JsonProperty(“isAquatic”)注释我的getter和setter
。在解决方案起作用时接受此答案,使用短语“handy dandy”时+1:-)