【问题标题】:Unexpected token (END_OBJECT), expected FIELD_NAME: missing property '@type'意外令牌 (END_OBJECT),预期 FIELD_NAME:缺少属性“@type”
【发布时间】:2017-04-25 21:36:15
【问题描述】:

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

【问题讨论】:

    标签: jackson jackson-modules jackson2 jackson-databind


    【解决方案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)

    这是 Jackson 的一项相当新的功能,并非一直都有。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-01-06
        • 2017-05-09
        • 2011-09-20
        • 2011-11-22
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多