Jackson JsonTypeInfo.As.EXTERNAL#u属性不';I don’我没有按预期工作
我正在使用Jackson解析我无法控制的JSON。JSON如下所示: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
{
"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类属性是假定的。谢谢非常感谢。你在那里救了我。实际上,我多次阅读了“只能用于属性”部分,但没有将其链接到表示我必须将注释移动到属性级别。