Java 使用现有同级属性值对属性进行Jackson多态反序列化

Java 使用现有同级属性值对属性进行Jackson多态反序列化,java,json,jackson,json-deserialization,polymorphic-deserialization,Java,Json,Jackson,Json Deserialization,Polymorphic Deserialization,我有一个使用JSON的现有请求/响应协议,我无法控制该协议 示例1:响应JSON不需要任何多态反序列化 { "name" : "simple_response" "params" : { "success" : true } } 示例2:响应JSON要求对params属性进行多态反序列化 { "name" : "settings_response", "params" : { "success" : true, "settings" : "Some

我有一个使用
JSON
的现有
请求
/
响应
协议,我无法控制该协议

示例1:响应
JSON
不需要任何多态反序列化

{
  "name" : "simple_response"
  "params" : {
    "success" : true
  }
}
示例2:响应
JSON
要求对params属性进行多态反序列化

{
  "name" : "settings_response",
  "params" : {
    "success" : true,
    "settings" : "Some settings info"
  }
}
我的班级结构如下所示:

class Response { // Not abstract. Used if no specialized response properties needed
  @JsonProperty("params")
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "name")
    @JsonSubTypes({
            @JsonSubTypes.Type(value=GetSettingsResponseParams.class, name="settings_response")
    })
  Params params;
  String name; // Need to use its value to determine type of params
}

class Params {
  boolean success;
}

class GetSettingsResponseParams extends Params {
  String settings;
}
当我尝试反序列化“示例2”中的
JSON
时,我得到:


我做错了什么?如何修复它?

Response
模型应如下所示:

class Response {

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "name", visible = true)
    @JsonSubTypes({
            @JsonSubTypes.Type(value = GetSettingsResponseParams.class, name = "settings_response"),
            @JsonSubTypes.Type(value = Params.class, name = "simple_response")
    })
    private Params params;
    private String name;

    // getters, settets, toString, etc.
}

上述模型适用于两个提交的
JSON
有效负载。

Michal Zlober,很抱歉,我的示例JSON中有一个错误。name属性是param属性的同级,这就是为什么我在JsonTypeInfo上使用include=JsonTypeInfo.As.EXTERNAL\u属性的原因。寻找一个解决方案,解决我现有api的约束。很抱歉弄错了。@FarrukhNajmi,在这种情况下,
EXTERNAL\u属性
有意义。我在你的类中尝试了我的
Response
class版本,它们在给定的有效负载下工作正常。您使用的是哪个版本的
Jackson
?@MichalZlober,非常感谢您花时间用一个非常清晰的示例帮助我解决这个问题。我的代码中有几个问题。JsonTypeInfo中缺少visible=true是一个。另一个是在我的Params类中具有不同名称的属性上缺少JsonProperty。
class Response {

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "name", visible = true)
    @JsonSubTypes({
            @JsonSubTypes.Type(value = GetSettingsResponseParams.class, name = "settings_response"),
            @JsonSubTypes.Type(value = Params.class, name = "simple_response")
    })
    private Params params;
    private String name;

    // getters, settets, toString, etc.
}