【问题标题】:Jackson serialization of abstract interface抽象接口的Jackson序列化
【发布时间】:2019-06-10 23:46:43
【问题描述】:

我正在使用一个框架来执行类Config 的Java Jackson 序列化,其中的字段supplier 是一个抽象接口Supplier<T>。下面的接口是在框架中定义的,所以我不能更改/添加注释。

public interface Supplier<T> {
    T get();
}

public interface Calculator {
}

@Data
@NoArgsConstructor
public class Config extends Serializable {
  private Supplier<Calculator> supplier;
}

我有Supplier的具体实现:

class MySupplier implements Supplier {
   @Override Calculator get() { return ...; }
}

当我将Config 的实例序列化为 JSON 时,供应商字段在没有类信息的情况下被序列化。据我了解,这是因为字段声明是抽象的。因此在反序列化期间,Jackson 不知道如何实例化 supplier 字段。

"config" : {
 ...
 "supplier" : { }
 ...
}

如何强制我的 Supplier 接口实现将类名信息添加到生成的 JSON 中以允许正确反序列化?我无权访问执行序列化和反序列化的代码,我只能操纵我的Supplier 实现。

【问题讨论】:

  • 你可以访问JacksonObjectMapper吗?许多框架允许自定义序列化过程。如果不进行自定义,我不确定您是否可以做很多事情。
  • @MichałZiober 是的,我确实可以访问 ObjectMapper。有没有办法通过这个对象对我的实现进行序列化?
  • 你找到解决这个问题的方法了吗?我的回答有帮助吗?

标签: java json serialization jackson


【解决方案1】:

Jackson 允许使用名为MixIn 的功能配置第三方类。欲了解更多信息,请阅读:

  1. Jackson Mixin to the Rescue
  2. Jackson Mix-In Annotations

您需要指定两个新接口,以便为其他类添加注释:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({@JsonSubTypes.Type(value = MySupplier.class, name = "MySupplier")})
interface SupplierAnnotations {
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
        @JsonSubTypes.Type(value = MyCalculator.class, name = "MyCalculator"),
        @JsonSubTypes.Type(value = HisCalculator.class, name = "HisCalculator") }
)
interface CalculatorAnnotations {
}

现在,您必须通知ObjectMapper 您的新课程。你可以这样做:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Calculator.class, CalculatorAnnotations.class);
mapper.addMixIn(Supplier.class, SupplierAnnotations.class);

您需要做的就是列出SuplierCalculator 接口的子类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多