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

时间:2017-08-28 13:46:57

标签: java json serialization jackson

我有一个抽象超类的自定义@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是我实际需要的信息。这让我觉得Deserializer类必须在某个地方提供这些信息。

1 个答案:

答案 0 :(得分:0)

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

也许你的JSON应该包含这类信息。