意外的令牌(END_OBJECT),预期的FIELD_NAME:缺少属性' @ type'

时间:2017-04-25 21:36:15

标签: jackson jackson-modules jackson2 jackson-databind

我在反序列化期间遇到异常,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)

2 个答案:

答案 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