【问题标题】:Get type of object deserialized by custom deserializer获取自定义反序列化器反序列化的对象类型
【发布时间】:2017-08-28 13:46:57
【问题描述】:

我有一个用于抽象超类的自定义 @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&lt;myObject&gt;,我必须在服务器上反序列化并映射到现有对象以更新它们。

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

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

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

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

MyObject2 是我真正需要的信息。这让我觉得 Deserializer 类必须在某处拥有这些信息。

【问题讨论】:

  • 你没有任何属性可以作为指导来找到合适的 Java 类来反序列化你的 JSON 吗?
  • 遗憾的是,我可以准确地找到 8 个子类中的 3 个,但我没有其他 5 个的任何信息。
  • 如果你没有任何属性或值可以用来选择正确的Java类,好吧,我认为那消息不会好...
  • 我想从JsonMappingException 中删除正确的子字符串,这可以与大量字符串操作一起使用。我只是想知道是否有更好的方法来提取这些信息,因为它显然存储在 MyObjectDeserializer 的某个地方。

标签: java json serialization jackson


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多