如何使用jackson将自定义反序列化器添加到接口 [英] How to add custom deserializer to interface using jackson

查看:780
本文介绍了如何使用jackson将自定义反序列化器添加到接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有一个接口A,我想为所有类实现接口A使用自定义反序列化器,所以我使用下面的代码,但它不起作用,而CustomAserializer工作。
那么我该如何使用我的自定义反序列化器反序列化所有类实现A.
谢谢。

Saying I have an interface A, I want to use custom deserializer for all classes implement interface A, So I use code below but it doesn't work, While CustomAserializer works. So what should I do to deserialize all classes implement A using my custom deserializer. Thanks.

module.addDeserializer(A.class, new CustomADeserializer());
module.addSerializer(A.class, new CustomASerializer())


推荐答案

您似乎错过了使用@JsonDeserialize(using = ImplementationClazz.class)来注释您的实现类,以指示用于反序列化抽象类或接口的类。

It seems you missed to annotate your implementation classes with @JsonDeserialize(using = ImplementationClazz.class) to indicate the class to be used to deserialize the abstract class or Interface.

使用Jackson对具有多个实现的接口进行反序列化的简单示例。

A simple example to deserialize a interface having multiple implementations using Jackson.

这是我的界面

@JsonDeserialize(using = UserDeserializer.class)
public interface User {
}

接口的一个实现

@JsonDeserialize(as = ServiceUser.class)
public class ServiceUser implements User{

    private String name;
    private String role;

  //constructor,setters & getters

第二次实施

@JsonDeserialize(as = AdminUser.class)
public class AdminUser implements User {

    private String role;
    private String designation;

//constructor,setters & getters

这里是反序列化器

 public class UserDeserializer extends JsonDeserializer<User> {

        @Override
        public User deserialize(JsonParser jp, DeserializationContext context) throws IOException {
            ObjectMapper mapper = (ObjectMapper) jp.getCodec();
            ObjectNode root = mapper.readTree(jp);
            /*write you own condition*/
            if (root.has("name") && root.get("name").asText().equals("XYZ")) {
                return mapper.readValue(root.toString(), ServiceUser.class);
            }
            return mapper.readValue(root.toString(), AdminUser.class);
        }
    }

如果您没有注释,可能会出现Stackoverflow错误实现类。所有实现类都应该自行反序列化,否则它将使用导致StackOverflowError的父类反序列化。

You may get Stackoverflow error if you doesn't annotate implementation class.All implementation class should deserialize with themselves, else it will use the parent class deserializer which leads to StackOverflowError.

这篇关于如何使用jackson将自定义反序列化器添加到接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆