Java 反序列化Jackson抽象类和多个具体类

Java 反序列化Jackson抽象类和多个具体类,java,jackson,Java,Jackson,我和Jackson在Java工作 我有一个抽象类Base.class,如下所示: @JsonDeserialize(as = Child1.class) public abstract class Base { @JsonProperty("field1") private Boolean field1; @JsonProperty("field2") private Long field2; //getters, se

我和Jackson在Java工作

我有一个抽象类Base.class,如下所示:

@JsonDeserialize(as = Child1.class)
public abstract class Base {

    @JsonProperty("field1")
    private Boolean field1;

    @JsonProperty("field2")
    private Long field2;
//getters, setters
}
ObjectMapper mapper = new ObjectMapper();

BaseChild1 child1 = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), BaseChild1.class)

BaseChild2 child2 = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), BaseChild2.class)

...
还有一组扩展抽象类的子类,如下所示:

public class Child1 extends Base {
    
        @JsonProperty("field3")
        private Boolean field3;
    
        @JsonProperty("field4")
        private Long field4;
    //getters, setters
    }
当我反序列化以下JSON时,它工作得非常好:

Base base = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), Base.class)
example.json:

{
  "field1":true,
  "field2":123456,
  "field3":false,
  "field4":123456,
}

问题是,这将此结构限制为基类和子类之间的一对一关系—要反序列化到其他子类中,我每次都需要更改注释。我尝试过其他注释,但一直无法解决。如何做到这一点?

我已经制定了一个解决方案,允许代码执行我需要它执行的操作,尽管我对结果并不完全满意。尽管如此,它还是有效的

解决方案是通过将被反序列化的中间抽象类而不是Base.class来扩展Base.class,如下所示:

Base.class(包含反序列化子类时要包含的通用字段):

我们将用于反序列化特定子级的“扩展”类:

@JsonDeserialize(as = Child1.class)
public abstract class BaseChild1 extends Base {}
还有孩子1.2级:

public class Child1 extends BaseChild1 {
    
        @JsonProperty("field3")
        private Boolean field3;
    
        @JsonProperty("field4")
        private Long field4;
    //getters, setters
    }
这意味着对于每个子类,我们将创建一个从Base.class扩展而来的空抽象类

然后,我们进行如下反序列化:

@JsonDeserialize(as = Child1.class)
public abstract class Base {

    @JsonProperty("field1")
    private Boolean field1;

    @JsonProperty("field2")
    private Long field2;
//getters, setters
}
ObjectMapper mapper = new ObjectMapper();

BaseChild1 child1 = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), BaseChild1.class)

BaseChild2 child2 = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), BaseChild2.class)

...

它并不完美,但很有效。

我已经找到了一个解决方案,允许代码完成我需要它做的事情,尽管我对结果并不完全满意。尽管如此,它还是有效的

解决方案是通过将被反序列化的中间抽象类而不是Base.class来扩展Base.class,如下所示:

Base.class(包含反序列化子类时要包含的通用字段):

我们将用于反序列化特定子级的“扩展”类:

@JsonDeserialize(as = Child1.class)
public abstract class BaseChild1 extends Base {}
还有孩子1.2级:

public class Child1 extends BaseChild1 {
    
        @JsonProperty("field3")
        private Boolean field3;
    
        @JsonProperty("field4")
        private Long field4;
    //getters, setters
    }
这意味着对于每个子类,我们将创建一个从Base.class扩展而来的空抽象类

然后,我们进行如下反序列化:

@JsonDeserialize(as = Child1.class)
public abstract class Base {

    @JsonProperty("field1")
    private Boolean field1;

    @JsonProperty("field2")
    private Long field2;
//getters, setters
}
ObjectMapper mapper = new ObjectMapper();

BaseChild1 child1 = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), BaseChild1.class)

BaseChild2 child2 = mapper.readValue(new File("src/test/resources/testerTemplate/example.json"), BaseChild2.class)

...
它不是完美的,但它是有效的