Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jackson JsonTypeInfo.As.EXTERNAL#u属性不';I don’我没有按预期工作_Json_Polymorphism_Jackson - Fatal编程技术网

Jackson JsonTypeInfo.As.EXTERNAL#u属性不';I don’我没有按预期工作

Jackson JsonTypeInfo.As.EXTERNAL#u属性不';I don’我没有按预期工作,json,polymorphism,jackson,Json,Polymorphism,Jackson,我正在使用Jackson解析我无法控制的JSON。JSON如下所示: { "status":"0" "type":"type1" "info": { // additional fields } } class Response { private String status; private Info info; //getters, setters } 我的班级看起来像这样 public class Respons

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

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

    private String status;
    private Info info;

    //getters, setters
}
我的班级看起来像这样

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_对象),应为字段名称:缺少要删除的属性“type” 包含类型id

如果我将EXTERNAL_属性更改为PROPERTY,我仍然会得到相同的错误。我对外部属性的理解有误吗?

来自Javadoc:

包含机制类似于属性,只是属性是 在层次结构中包括一个更高的级别,即在 与要键入的JSON对象的级别相同。请注意,此选项只能是 用于属性,不用于类型(类)。试着用它来 类将导致基本属性的包含策略

请注意,
只能用于属性
为粗体。来源:

因此,您必须将所有注释从
Info
类移动到
Response
类中的属性
Info
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关心类型。您的类可以如下所示:

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

    private String status;
    private Info info;

    //getters, setters
}

另请参见这个问题:。

我对外部财产如何运作的概念有一个确切的问题。你在这方面有什么进展吗?很遗憾,马克没有。为了避免这个问题,我们最终完全改变了对象模型。我阅读了JavaDoc,但不理解java类属性是假定的。谢谢非常感谢。你在那里救了我。实际上,我多次阅读了“只能用于属性”部分,但没有将其链接到表示我必须将注释移动到属性级别。