当前位置: 首页 > 知识库问答 >
问题:

Jackson多态反序列化

公西永嘉
2023-03-14

我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。

我的基本类看起来像:

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.PROPERTY,
  property = "type")
@JsonSubTypes({
  @Type(value = SubA.class, name = "SubA")
})
public class Base {
  protected String command; // +get +set
  protected String type; // +get +set
}

...和一个派生自Base的类:

@JsonTypeName("SubA")
public class SubA extends Base {
  private AnotherClass anotherClass; // +get +set
  private String test; // +get +set
  @JsonIgnore
  @Override
  public String getType() {
    return "SubA";
  }
}

... 我试图执行以下代码:

ObjectMapper mapper = new ObjectMapper();
ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
Base payload = new SubA(); // + setting anotherClass as well as test variables
String requestStringSend = ow.writeValueAsString(payload);
System.out.println("Sending: " + requestStringSend);
Base received = mapper.readValue(requestStringSend, Base.class);
String requestStringReceived = ow.writeValueAsString(received);
System.out.println("Received: " + requestStringReceived);

StringRequest estStringTransfer是:

Sending: {
  "command" : "myCommand",
  "type" : "SubA",
  "anotherClass" : {
    "data" : "someData"
  },
  "test" : "test123"
}

但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它不存在于库中。但我认为映射器会将其转换为SubA类?

Exception in thread "main" org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "anotherClass" (Class com.test.Base), not marked as ignorable
  at [Source: java.io.StringReader@1256ea2; line: 4, column: 21] (through reference chain: com.test.Base["anotherClass"])
  at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
  at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
  at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:649)
  at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:635)
  at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1355)
  at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:717)
  at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
  at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2723)
  at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1854)
  at com.test.Foo.main(Foo.java:32)

我看了以下问题/资源:

  • 使用Jackson将Json反序列化到另一个类层次结构中

共有1个答案

杨豪
2023-03-14

您的代码看起来与用例相符。一个可能的问题是,您可能会意外地将Jackson 2注释与Jackson 1 ObjectMapper一起使用(我可以看到后者是来自例外包名称的Jackson)。注释和映射器的版本必须匹配;否则注释将被忽略,这将解释您看到的问题。

 类似资料:
  • 我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c

  • 问题内容: 如果我有这样的类结构: 还有另一种反序列化的方法吗?在父类上使用此注释: 我不想强迫我的API的客户包括反序列化一个子类。 杰克逊不是使用,而是提供了一种方法来注释子类并通过唯一属性将其与其他子类区分开来?在上面的示例中,这类似于“如果JSON对象将其反序列化为,如果它将其反序列化为”。 问题答案: 感觉像是应该使用的东西,但是我在文档中进行了选择,可以提供的任何属性似乎都不符合您所描

  • 我有以下几个类,我想使用Jackson反序列化JSON字符串。 PushNotificationMessage.java 设备信息。Java语言 IOSDeviceInfo。Java语言 WebDeviceInfo.java 我有以下要反序列化的JSON内容: 我只需使用ObjectMapper来尝试执行反序列化。 当我这样做时,我得到: com.fasterxml.jackson.databin

  • 我看过jackson反序列化@JsonTypeInfo的一个例子,那就是: 我试过了,效果很好。现在的问题是,在示例类中,Cat和Dog是从Animal中引用的,我想避免这种情况。有没有一种方法可以将类型绑定从类动物中移除,并且仍然进行反序列化工作?谢谢

  • 我想反序列化以下XML(缩短示例): 到目前为止,我想出的代码: 但这种方法存在几个问题: > @JacksonXmlProperty t(localName="subject")始终为空,因为我将其用于类型信息。为什么?,或者如何绕过它? 还是这种方法已经错了? 最后是我使用的周围类:

  • 我有以下Jackson注释类(Kotlin) 我试图反序列化不包含类型属性的JSON,但我提供了具体的类,所以这无关紧要 无论如何,当尝试解析...的子类型时,我得到