java - RestController 的抽象类自定义反序列化

标签 java spring json-deserialization

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

PluginTemplateA、PluginTemplateB、PluginTemplateC

我有一个其他类,其中有一个包含 PluginTemplate 列表的 map 。

    @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 直接获取值 (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/

相关文章:

java - Lombok 未创建默认构造函数导致 jackson-databinding 失败

Eclipse 不会将 jar 部署到 WEB-INF/lib 目录中

java - 通过属性名称列表检查 getter 值

java - 如何在GWT中使用autobean将json转换为java类

java - Jackson - 仅在满足条件时序列化值,忽略空值

java - 从 config.properties 文件读取路径

java - 使用 MySQL 从 Spark Framework 和 Thymeleaf 中的数据库中删除用户

java - 命名 boolean 值在 while 语句中不起作用

java - 如何通过 REST API 关联两个实体

java - 使用与生产者使用的模型对象不同的模型对象来消费 Kafka 消息