jackson - 意外的 token (END_OBJECT),应为FIELD_NAME : missing property '@type'

标签 jackson jackson-modules jackson2 jackson-databind

我在反序列化期间遇到异常,访客配置文件是根对象内的嵌套对象(其中有几个级别)。我无法控制它的序列化方式,因为我只是来自 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/

相关文章:

java - 我如何才能不使用 JAX-RS 接口(interface)序列化对象的某些部分(子对象)?

java - 使用 Jackson 解析器获取整个 JSON 对象

Java对象转json,如何通过路径序列化引用

java/jackson - 不要序列化包装类

java - Jackson , java.time , ISO 8601 , 无毫秒序列化

java - 两个 Jackson ObjectMapper 生成不同的序列化

java - 解析在 Java 中连接成一个字符串的所有 json

java - 使用流式 api 提取部分 json 字符串并转换为 jsonTree (Jackson)

java - 如何在同一个类下设计多个对象,如 JSON 映射所示?

java - Jersey 中属性名称定义冲突,使用 Jackson 2.9.6