2

我在反序列化期间遇到异常,来宾配置文件是 Root 对象中的嵌套对象(其中的几个级别)。我无法控制它的序列化方式,因为我只是来自 kafka 主题的这条消息的消费者。有没有办法使这项工作,除了设置

mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE,false);

GuestProfile这对我有用,并在填充其他属性的情况下返回 null 。但是,我需要一种方法来自定义 JSON 中这个特定嵌套对象的反序列化并填充它。

com.fasterxml.jackson.databind.JsonMappingException:意外令牌(END_OBJECT),预期 FIELD_NAME:缺少包含类型 ID 的属性“@type”(对于 com.test.GuestProfile 类)

4

2 回答 2

1

当使用接口或多态类型时,Jackson JSON 库会引发此异常。GuestProfile 必须是多态类型,可以是接口、抽象类,也可以是实际实现并且有父类。

这种多态类型可以配置为使用 JSON 中的类型提示。寻找类似的东西

@JsonTypeInfo(使用 = JsonTypeInfo.Id.NAME,包括 = JsonTypeInfo.As.PROPERTY)

关于 Java 类型。

您可以更改默认@type名称,例如仅“键入”:

@JsonTypeInfo(使用 = JsonTypeInfo.Id.NAME,包括 = JsonTypeInfo.As.PROPERTY,属性 =“类型”)

您的对象的序列化 JSON 值当前需要该附加属性“@type”。由于您无法更改 JSON 的生成,因此这不是您的解决方案。

如果只有一个实现,那么您可以使用:

@JsonDeserialize(as = GuestProfile.class)

这是杰克逊的一个相当新的功能,它并不总是存在。

否则,您可以自定义反序列化过程。您可以配置自己的反序列化器,然后查看传入的值,并根据内容决定反序列化的目标对象类型。

请参阅https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization

于 2017-08-28T03:23:53.463 回答
0

如果要忽略此类中不可用的字段,可以在类上使用 JsonIgnoreProperties(ignoreUnknown=true) 注释。请参阅以下链接了解更多详情。
https://www.thetechnojournals.com/2019/10/entity-object-conversion-to-dto-object.html

于 2019-10-26T17:45:20.297 回答