使用现有兄弟属性值的Jackson多态反序列化属性

3

我有一个现有的Request/Response协议,使用JSON,但我无法控制。

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

{
  "name" : "simple_response"
  "params" : {
    "success" : true
  }
}

例子2:响应需要对params属性进行多态反序列化的JSON

{
  "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时,出现以下错误:

Unexpected token (END_OBJECT), expected VALUE_STRING: need JSON String that contains type id (for subtype of com.foo.Params)

我做错了什么,该怎么修复它?
1个回答

2

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中有一个错误。名称属性是param属性的同级,这就是为什么我在JsonTypeInfo上使用'include = JsonTypeInfo.As.EXTERNAL_PROPERTY'的原因。正在寻找符合现有API限制的解决方案。对于错误表示歉意。 - Farrukh Najmi
@FarrukhNajmi,在这种情况下,EXTERNAL_PROPERTY是有意义的。我使用我的版本的Response类与您的类,并且它们对于给定的有效载荷按预期工作。您使用哪个版本的Jackson - Michał Ziober
1
@MichalZlober,非常感谢你抽出时间用一个非常清晰的例子帮助我解决了这个问题。我的代码中有几个问题。其中之一是在JsonTypeInfo中缺少visible = true。另一个问题是在我的Params类中具有不同名称的属性缺少JsonProperty。 - Farrukh Najmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接