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

gr8qqesn  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(313)

我和Jackson在 java 工作。
我有一个抽象类base.class,如下所示:

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

    @JsonProperty("field1")
    private Boolean field1;

    @JsonProperty("field2")
    private Long field2;
//getters, setters
}

以及一组扩展抽象类的子类,如下所示:

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,
}

问题是,这将此结构限制为基类和子类之间的一对一关系—要反序列化为其他子类,我每次都需要更改注解。我试过其他注解,但一直没能解决。我该怎么做?

wfypjpf4

wfypjpf41#

我已经制定了一个解决方案,允许代码做我需要它做的事情,尽管我对结果并不完全满意。尽管如此,它还是有效的。
解决方案是通过将反序列化的中间抽象类而不是base.class来扩展base.class,如下所示:
base.class(包含反序列化子类时要包含的泛型字段):

public abstract class Base {

    @JsonProperty("field1")
    private Boolean field1;

    @JsonProperty("field2")
    private Long field2;
//getters, setters
}

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

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

孩子们。班级:

public class Child1 extends BaseChild1 {

        @JsonProperty("field3")
        private Boolean field3;

        @JsonProperty("field4")
        private Long field4;
    //getters, setters
    }

这意味着对于每个子类,我们将创建一个从base.class扩展而来的空抽象类。
然后反序列化如下:

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)

...

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

相关问题