杰克逊。反序列化具有不同泛型类型的列表

Jackson. Deserialeze lists with different generic types

我想使用 jackson 库使用自定义反序列化器反序列化 List。 List 和 List 应该默认反序列化。

有我的class

public class Application implements Serializable {
    //other fields

    private List<Document> documents;
    private List<Contact> contacts;
    private List<Good> goods;
}

但我无法更改它以添加注释。所以我使用 mixin

public abstract class ApplicationMixin {
    @JsonProperty("contactId")
    private List<Contact> contacts;
}

自定义解串器:

@JsonComponent
public class ContactsDeserializer extends JsonDeserializer<List<Contact>> {
    @Override
    public List<Contact> deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        List<Contact> contacts = new ArrayList<>();

        //some logic

       return contacts;
   }
}

并且在反序列化期间,所有列表都尝试使用此自定义反序列化程序。 但我只希望它用于联系人。 我能为此做什么?

观察到的行为是由 type erasure 引起的。在运行时,Jackson 无法区分 List<Contact>List<Document> 或任何其他列表,因此它将 ContactsDeserializer 应用于所有列表。您将需要更准确地了解反序列化器应该应用于什么。

您可以尝试以下方法:

  1. ContactsDeserializer
  2. 中删除 @JsonComponent 注释
  3. ApplicationMixin 中,将 @JsonDeserialize(using = ContactsDeserializer.class) 添加到 contacts 字段。
public abstract class ApplicationMixin {
    @JsonProperty("contactId")
    @JsonDeserialize(using = ContactsDeserializer.class)
    private List<Contact> contacts;
}

或者,您可以考虑为 Contact class 而不是 List<Contact> 创建自定义反序列化器。如果可能取决于输入 JSON 格式。