杰克逊。反序列化具有不同泛型类型的列表
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 应用于所有列表。您将需要更准确地了解反序列化器应该应用于什么。
您可以尝试以下方法:
- 从
ContactsDeserializer
中删除 @JsonComponent
注释
- 在
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 格式。
我想使用 jackson 库使用自定义反序列化器反序列化 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 应用于所有列表。您将需要更准确地了解反序列化器应该应用于什么。
您可以尝试以下方法:
- 从
ContactsDeserializer
中删除 - 在
ApplicationMixin
中,将@JsonDeserialize(using = ContactsDeserializer.class)
添加到contacts
字段。
@JsonComponent
注释
public abstract class ApplicationMixin {
@JsonProperty("contactId")
@JsonDeserialize(using = ContactsDeserializer.class)
private List<Contact> contacts;
}
或者,您可以考虑为 Contact
class 而不是 List<Contact>
创建自定义反序列化器。如果可能取决于输入 JSON 格式。