Jackon JSON:子类未知时的多态解除

时间:2016-06-13 15:02:26

标签: jackson

我试图使用Jackson对JSON进行一些多态解除分类,但是子类列表在编译时是未知的,所以我不能在基类上使用@JsonSubtype注释。 相反,我想使用TypeIdResolver类来执行与属性值的转换。

我可能遇到的可能子类列表将是动态的,但它们都是在运行时使用注册表注册的。所以我似乎需要我的TypeIdResolver对象来引用该注册表类。它必须在基本上是依赖注入环境中运行(即我不能有TypeIdResolver参考的单例类),所以我认为我需要将注册表类注入TypeIdResolver。我想要写的认为的代码是:

ObjectMapper mapper = new ObjectMapper();
mapper.something(new MyTypeIdResolver(subclassRegistry));
mapper.readValue(...)

然而,我无法找到一种在中间做位的方法。我能找到的唯一方法是使用java注释来指定TypeIdResolver将会是什么。

这个问题Is there a way to specify @JsonTypeIdResolver on mapper config instead of annotation?是相同的,虽然动机不同,答案是使用注释mixin,这在这里不会起作用。

2 个答案:

答案 0 :(得分:1)

SimpleModule有方法registerSubtypes(),您可以使用方法注册子类型。如果仅传递Class es,则使用简单类名作为类型ID,但您也可以传递NamedType来定义要用于子类的类型ID。

所以,如果你知道完整集,只需构建SimpleModule,将其注册到mapper。

否则,如果这不起作用,您可能需要诉诸于通过静态单例实例(如果适用)或甚至ThreadLocal共享数据。

答案 1 :(得分:0)

请注意,最后我做的是放弃杰克逊并编写我自己更简单的基于javax.json的框架,它只是以更简单的方式完成了我想要的各种序列化。我只处理简单的DTO(数据传输对象)类,所以编写我自己的简单框架要简单得多。