获取由自定义反序列化程序反序列化的对象类型



我有一个抽象超类的自定义@JacksonDeserializer

@JacksonDeserializer
public abstract class MyObject {
private String id;
...
}
public class MyObjectDeserializer extends JsonDeserializer<MyObject> {
@Override
public MyObject deserialize(JsonParser jp, DeserializationContext arctxtg1)
throws IOException, JsonProcessingException {

JsonNode node = jp.getCodec().readTree(jp);
String id = node.get("id").asText();
System.out.println("ID = "+id);
//Here I need to determine which type of MyObject
//currently needs to be deserialized.

}
}

我的系统知道这个类的 8 个子类,其中一些但不是全部具有唯一的属性。

现在我从客户端获取一个 JSON 对象,其中包括一个ArrayList<myObject>,我必须在服务器上反序列化并映射到现有对象以更新它们。

问题是对于所有子类,都会调用相同的@JacksonDeserializer,并且我无法弄清楚是否/如何访问要在@override deserialize()方法中反序列化的类类型。 问题是我显然无法实例化抽象超类,也无法实例化任何子类,因为我无法确定当前反序列化的对象属于哪个。

所以问题是:有什么方法可以从反序列化器中获取需要实例化哪个子类的信息?

是什么让我认为这应该是可能的: 当我随机实例化其中一个子类(例如 MyObject1)时,我收到此错误:

com.fasterxml.jackson.databind.JsonMappingException: 
com.myCompany.myPackage.MyObject1 cannot be cast to 
com.myCompany.myPackage.MyObject2

其中MyObject2是我真正需要的信息。这让我觉得解串器类必须在某处有这些信息。

正如 Cassio 所说,如果您没有任何属性可以帮助您确定 JSON 对象的类型,您将无法使用正确的 ObjectMapper 对其进行反序列化。

也许您的 JSON 应该包含此类信息。

最新更新