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

标签 java json jackson json-deserialization polymorphic-deserialization

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

示例 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 时,我得到:

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

我做错了什么以及如何解决它?

最佳答案

响应模型应如下所示:

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 有效负载。

关于java - 使用现有同级属性值对属性进行 Jackson 多态反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59000068/

相关文章:

插件系统中的java.lang.NoClassDefFoundError

java - 在 "VM options"和 "Program arguments"中使用环境变量

java - Spring mvc 映射 json 到 pojo 属性为空

java - jackson : How to serialize into an unnamed array

java - StackOverflow 错误 - 具有 HashMap <Entity,Integer> 的 JPA 实体

java - 如何在 Java 中同步运行一个进程?

java - 在java中编写opencsv生成的文件时,如何创建一个没有标题的文件?

javascript - JavaScript 中的 Json eval 函数

javascript - 如何使用 Ajax 将变量从 PHP 发送到 javascript?

java - 序列化@JsonIgnore-d字段