【问题标题】:Jackson JsonTypeInfo.As.EXTERNAL_PROPERTY doesn't work as expectedJackson JsonTypeInfo.As.EXTERNAL_PROPERTY 无法按预期工作
【发布时间】:2013-09-12 06:57:55
【问题描述】:

我正在使用 Jackson 来解析我无法控制的 JSON。 JSON 如下所示:

{
    "status":"0"
    "type":"type1"
    "info": {
       // additional fields
    }
}

我的班级是这样的

public class Response {
    private String status;
    private String type;
    private Info info
}

我使用的 Info 的子类取决于 type 属性,所以我对 info 的映射是

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = {
        @JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
        @JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public abstract class Info {
    // some fields
}

据我所知,当区分元素与必须转换的元素处于同一级别时,这是使用类型信息的正确方法。但这不起作用,我总是得到同样的错误:

com.fasterxml.jackson.databind.JsonMappingException:意外的令牌 (END_OBJECT),预期的 FIELD_NAME:缺少属性“类型”,即 包含类型 ID

如果我将 EXTERNAL_PROPERTY 更改为 PROPERTY,我仍然会收到相同的错误。我对 EXTERNAL_PROPERTY 的理解有误吗?

【问题讨论】:

  • 我对 EXTERNAL_PROPERTY 应该如何工作的概念有这个确切的问题。你在这方面有什么进展吗?
  • 不幸的是不是马克。我们最终完全改变了对象模型以避免这个问题。

标签: json polymorphism jackson


【解决方案1】:

来自 Javadoc:

包含机制类似于 PROPERTY,只是属性是 在层次结构中包含更高一级,即作为同级财产 与要键入的 JSON 对象级别相同。注意这个选项只能是 用于属性,而不用于类型(类)。试图将其用于 类将导致包含基本属性的策略。

注意到can only be used for properties 是粗体的。来源:JsonTypeInfo.As.EXTERNAL_PROPERTY

因此,您必须将所有注释从 Info 类移动到属性 infoResponse 类中的 setInfo 方法。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = { @JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
        @JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public void setInfo(Info info) {
    this.info = info;
}

对我来说,您还应该从 Response 类中删除 type 属性。它将在序列化过程中动态生成。在反序列化中你不需要它,因为 Jackson 关心类型。您的课程可能如下所示:

class Response {

    private String status;
    private Info info;

    //getters, setters
}

另请参阅此问题:JSON nest class data binding

【讨论】:

  • 我阅读了 JavaDoc,但不明白应该使用 java 类属性。谢谢!
  • 谢谢!你在那里救了我。我实际上多次阅读“只能用于属性”的部分,但没有链接它意味着我必须将注释移动到属性级别。
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 2014-12-09
  • 2016-01-13
  • 2020-09-21
  • 2011-08-17
  • 2012-04-29
  • 2021-08-12
  • 2019-02-04
相关资源
最近更新 更多