我有一个抽象类PluginTemplate,由3个子类继承

PluginTemplateA, PluginTemplateB, PluginTemplateC

我有一些其他类具有包含PluginTemplate列表的映射。

    @JsonDeserialize(using = PluginDeserializer.class)
    public class PluginContainer {
        // map stores enum to template list mapping, enum can be used to identify template type
        Map<PluginTemplateEnum, List<PluginTemplate>> pluginTemplatesList;
        other variables....
    }


我在请求后将PluginContainer的对象发送到使用RestController的其他服务

    @RequestMapping(value = "/plugin/generateDetails", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public String generateDetails(@PathVariable Long interfaceId, @RequestBody List<PluginContainer> containers) throws Exception {
        // other code
    }


我知道要发送json,我将需要一个抽象类PluginTemplate的自定义json解串器。

我已经开始写一个像这样的json反序列化器

public class PluginDeserializer extends JsonDeserializer<PluginContainer> {
    @Override
    public PluginContainer deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException {
        // what should I write here
    }
}


我应该如何使用Map键值识别PluginContainer的类型,并在此方法中对其进行反序列化。

最佳答案

遍历TreeNode键或使用TreeNode.get直接获取Value(TreeNode)

 public PluginContainer deserialize(JsonParser jp, DeserializationContext context) throws IOException, JsonProcessingException {
        TreeNode treeNode = jp.getCodec().readTree(jp);
        Iterator<String> nameItr = treeNode.fieldNames();
        while(nameItr.hasNext()) {  //Iteratae Over keys
            String key = nameItr.next();
        }
        //or you can just get the required value for key
        //i.e.
        treeNode.get("fieldName");

    }

关于java - RestController的抽象类自定义反序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61507983/

10-10 21:49