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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杰克逊:冲突的@JsonTypeInfo和@JsonSerialize(as = Klass.class)相关的知识,希望对你有一定的参考价值。

问题

我需要使用原始属性以多态方式JSON-(de-)序列化@Autowired Spring bean(我使用的是Spring Boot 2.0.4)。

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

到目前为止尝试过

为了避免杰克逊试图序列化“增强”部分,我已经将我的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"}}

预期/期望。

那么,问题是:

“纯粹的”杰克逊意味着解决这个问题的方法,还是我只需忍受它?

答案

你尝试过:

@JsonRootName(value = "NameOfYourClass")

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

以上是关于杰克逊:冲突的@JsonTypeInfo和@JsonSerialize(as = Klass.class)的主要内容,如果未能解决你的问题,请参考以下文章

使用Jackson As.External_Property和Collection

杰克逊映射器在三星 SM-T580 上抛出“冲突的二传手定义”

使用@JsonIdentityInfo 时杰克逊“MismatchedInputException:找不到实例的对象 ID”

使用JsonTypeInfo从Jackson序列化中删除基类名称

jackson-- JsonTypeInfo多态反序列化

JSONTypeInfo 不忽略继承映射中的属性