jackson 如何根据嵌套类型属性确定反序列化的子类?

cgh8pdjw  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(186)

我有一个接口Node和三个实现它的类:Root, JunctionLeaf。我希望从JSON字符串中反序列化一个节点列表。JSON字符串中的每个节点看起来像这样:

{  
parameters: {  
    type:<node_type>,  
    some_more_properties  
    },
childNodes:{some_more_nodes}  
}

如何根据parameters内部的类型来确定Node的子类型。我应该扩展哪些类,我应该如何扩展它们以及如何将它们添加到ObjectMapper/Annotation?
谢谢

bnlyeluc

bnlyeluc1#

我可以通过使用自定义反序列化器来实现这一点:

public class CMNodeCustomDeserializer extends StdDeserializer<CMNode> {

private final Map<String, Class<? extends CMNode>> registry = Map.of("ROOT", CMRootNode.class,
                                                               "JUNCTION", CMJunctionNode.class,
                                                               "LEAF", CMLeafNode.class);

public CMNodeCustomDeserializer() {
    super(CMNode.class);
}

@Override
public CMNode deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();
    JsonNode root = mapper.readTree(jsonParser);
    String type = root.get("parameters").get("type").asText();
    return mapper.treeToValue(root, registry.get(type));
}

}

相关问题