我在反序列化期间遇到异常,访客配置文件是根对象内的嵌套对象(其中有几个级别)。我无法控制它的序列化方式,因为我只是来自 kafka 主题的这条消息的消费者。除了设置之外,还有其他方法可以使其工作吗
mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE,false);
这对我有用,并为 GuestProfile
返回 null,并填充其他属性。但是,我需要一种方法来自定义 JSON 中这个特定嵌套对象的反序列化并填充它。
com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property '@type' that is to contain type id (for class com.test.GuestProfile)
最佳答案
当使用接口(interface)或多态类型时,Jackson JSON 库会抛出此异常。 GuestProfile 必须是多态类型,可以是接口(interface)、抽象类,也可以是实际实现并且有父级。
此多态类型可以配置为使用 JSON 中的类型提示。寻找类似的东西
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
关于 Java 类型。
您可以更改默认的@type
名称,例如仅“type”:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
对象的序列化 JSON 值当前需要附加属性“@type”。由于您无法更改 JSON 的生成,因此这不适合您。
如果只有一个实现,那么您可以使用:
@JsonDeserialize(as = GuestProfile.class)
这是 Jackson 的一个相当新的功能,它并不总是存在。
否则,您可以自定义反序列化过程。您可以配置自己的反序列化器,然后查看传入的值,并根据内容决定反序列化为哪种目标对象类型。
参见https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
关于jackson - 意外的 token (END_OBJECT),应为FIELD_NAME : missing property '@type' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43621391/