簡體   English   中英

如何使用 jackson 將自定義解串器添加到界面

[英]How to add custom deserializer to interface using jackson

說我有一個接口 A,我想為實現接口 A 的所有類使用自定義反序列化器,所以我使用下面的代碼但它不起作用,而 CustomAserializer 工作。 那么我應該怎么做才能使用我的自定義反序列化器反序列化所有實現 A 的類。 謝謝。

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

您似乎忘記使用@JsonDeserialize(using = ImplementationClazz.class)注釋您的實現類,以指示該類應該用於反序列化抽象類或接口。

以下是使用 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 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);
    }
}

如果您不注釋實現類,您可能會收到 StackOverflowError。 所有實現類都應該反序列化自己,否則它將使用來自父類的反序列化器,這會導致 StackOverflowError。

以防萬一有人需要一個解決方案來序列化和反序列化繼承層次結構

您可以以更優雅的方式使用 jackson 注釋: JsonTypeInfoJsonSubTypes

 @JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME, 
  include = JsonTypeInfo.As.PROPERTY, 
  property = "type")
@JsonSubTypes({ 
  @Type(value = ServiceUser.class, name = "service"), 
  @Type(value = AdminUser.class, name = "admin") 
})
public interface User{
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM