Java 反序列化Jackson抽象类和多个具体类
我和Jackson在Java工作 我有一个抽象类Base.class,如下所示: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
@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)
...
它不是完美的,但它是有效的