杰克逊:@JsonTypeInfo和@JsonSerialize(as = Klass.class)

时间:2018-09-05 14:32:49

标签: java spring-boot polymorphism json-deserialization jackson2

问题

我需要仅使用原始属性对@Autowired Spring bean(我正在使用Spring Boot 2.0.4)进行多态JSON-(反序列化)。

由于该bean是“增强型”,因此它是我的“原始” bean的子类,其类名以$$EnhancerBySpringCGLIB$$12345结尾。

到目前为止已尝试

为了避免Jackson尝试序列化“增强”部分,我声明了自己的bean是其自身的超类型,

@JsonSerialize(as=MyClass.class)

它按预期工作。

但是,当我尝试使用多态序列化时

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.WRAPPER_OBJECT)

放置在所述类实现的接口上,包装对象的键是增强类的名称! JSON字符串的其余部分都可以,也就是说,仅包含“原始”类的属性。不用说,我现在不能反序列化它,因为提到的子类不再存在。

使用JsonTypeInfo.Id.NAME破坏了多态反序列化的整个想法,恕我直言。如果没有其他作用,我可以通过查询ApplicationContext来确定目标类。

编辑:

以下是Foo Bar的示例:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = As.WRAPPER_OBJECT)
public class Foo {

  private String foo = "Foo";

  @JsonSerialize(as = Bar.class)
  public static class Bar extends Foo {
    private String bar = "Bar";
  }

  public static class UnwantedMutant extends Bar {
    private String aThing = "Not welcome";
  }

  public static void main(String[] args) throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    UnwantedMutant mutant = new UnwantedMutant();
    System.out.println(mapper.writeValueAsString(mutant));
  }
}

此打印

{"mypackage.Foo$UnwantedMutant":{"foo":"Foo","bar":"Bar"}}

同时

{"mypackage.Foo$Bar":{"foo":"Foo","bar":"Bar"}}

是预期/期望的。

所以,问题是

用杰克逊(Jackson)所说的“纯”来解决这个问题有什么办法吗,还是我只能忍受它?

1 个答案:

答案 0 :(得分:0)

您尝试过:

@JsonRootName(value = "NameOfYourClass")吗?

对不起,如果我不明白您的问题。