How to add custom deserializer to interface using

2020-03-02 19:53发布

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())

1条回答
戒情不戒烟
2楼-- · 2020-03-02 19:59

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

The following is a simple example to deserialize an interface having multiple implementations using Jackson.

Here is my interface:

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

One implementation of the interface:

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

    private String name;
    private String role;

    //constructor, setters & getters

Second implementation:

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

    private String role;
    private String designation;

    //constructor, setters & getters

And here is the deserializer:

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 your 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);
    }
}

You may get a StackOverflowError if you don't annotate the implementation classes. All implementation classes should deserialize themselves, otherwise it will use the deserializer from the parent class which leads to a StackOverflowError.

查看更多
登录 后发表回答