作者:YooHoo | 来源:互联网 | 2023-10-10 12:06
@Data
public class Parent {
private String type;
private List children;
}
public abstract class ChildBase {
public void someMethod(){};
}
@Data
public class ChildA extents ChildBase {
private String bar;
}
@Data
public class ChildB extents ChildBase {
private String foo;
}
然后,原始的json字符串是:
{
"type": "childA","children": [
{
"bar": "baaaar"
}
]
}
我如何反序列化此json字符串,反序列化的对象(实例为Parent
),其children
字段的实际类型应为ChildA,因为指定了type
字段;
在问题use-property-of-parent-object-to-determine-subclass-when-deserializing中,答案打击显示了确定子类的方法,因为它不适用于列表字段
对于abstract
类,一种方法是创建自定义解串器以实现您想要的目标,如下所示。
因为我不确定JSON数组children
中的所有键是否都相同,例如如果bar
是foo
或type
,则所有键分别是{{1}}或childA
。因此,我使用字段名称来确定应该将JSON对象反序列化到哪个类(childB
或ChildA
)。
代码段
ChildB
然后使用class ParentDeserializer extends StdDeserializer {
public ParentDeserializer() {
this(null);
}
public ParentDeserializer(Class> vc) {
super(vc);
}
@Override
public Parent deserialize(JsonParser jp,DeserializationContext ctx)
throws IOException,JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String type = node.get("type").asText();
List children = new ArrayList<>();
node.get("children").forEach(e -> {
if (e.has("bar")) {
children.add(new ChildA(e.get("bar").asText()));
}
if (e.has("foo")) {
children.add(new ChildB(e.get("foo").asText()));
}
});
Parent parent = new Parent();
parent.setType(type);
parent.setChildren(children);
return parent;
}
}
直接在类@JsonDeserialize(using = ParentDeserializer.class)
上注册反序列化器。
Parent