Jackon JSON:当子类未知时,进行多态去相关化



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

我可能遇到的可能的子类列表将是动态的,但它们都是在运行时通过注册表注册的。因此,我似乎需要我的TypeIdResolver对象来引用该注册表类。它必须在本质上是依赖注入环境的环境中操作(即,我不能有TypeIdResolver咨询的singleton类),所以我认为我需要将注册表类注入TypeIdResolve。我认为我想写的代码类型是:

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

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

这个问题有没有办法在映射器配置中指定@JsonTypeIdResolver而不是注释?是相同的,尽管动机不同,答案是使用注释mixin,这在这里不起作用。

SimpleModule具有方法registerSubtypes(),您可以使用该方法注册子类型。如果只传递Classes,则使用简单类名作为类型id,但也可以传递NamedType来定义用于子类的类型id。

所以,若您确实知道完整集,只需构建SimpleModule,并将其注册到mapper中。

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

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

最新更新