我在反序列化期间遇到异常,guest虚拟机配置文件是Root对象中的嵌套对象(其中的几个级别)。我无法控制它是如何序列化的,因为我只是来自kafka主题的消息的消费者。有没有办法使这项工作,除了设置
mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE,false);
适用于我,并为GuestProfile
返回null,并填充其他属性。但是,我需要一种方法来为JSON中的这个特定嵌套对象自定义反序列化并让它填充。
com.fasterxml.jackson.databind.JsonMappingException:意外的令牌 (END_OBJECT),预计FIELD_NAME:缺少属性' @ type'就是这样 包含类型id(对于类com.test.GuestProfile)
答案 0 :(得分:1)
当使用接口或多态类型时,Jackson JSON库会抛出此异常。 GuestProfile必须是多态类型,无论是接口,抽象类,还是实际的实现,它都有父类。
可以将此多态类型配置为使用JSON中的类型提示。寻找像
这样的东西@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY)
在Java类型上。
您可以更改默认的@type
名称,例如更改为"输入":
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property =" type")
对象的序列化JSON值当前需要额外的属性' @ type'。由于您无法更改JSON的生成,因此这不适合您。
如果只有一个实现,那么您可以使用:
@JsonDeserialize(as = GuestProfile.class)
这是杰克逊的一个新特点,它并不总是存在。
否则,您可以自定义反序列化过程。您可以配置自己的反序列化器,然后查看传入值,并根据要反序列化的目标对象类型的内容来决定。
请参阅https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization
答案 1 :(得分:0)
如果要忽略此类中不可用的字段,可以在类上使用JsonIgnoreProperties(ignoreUnknown = true)批注。请参阅以下链接以获取更多详细信息。
https://www.thetechnojournals.com/2019/10/entity-object-conversion-to-dto-object.html