我试图使用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,这在这里不会起作用。
答案 0 :(得分:1)
SimpleModule
有方法registerSubtypes()
,您可以使用方法注册子类型。如果仅传递Class
es,则使用简单类名作为类型ID,但您也可以传递NamedType
来定义要用于子类的类型ID。
所以,如果你知道完整集,只需构建SimpleModule
,将其注册到mapper。
否则,如果这不起作用,您可能需要诉诸于通过静态单例实例(如果适用)或甚至ThreadLocal
共享数据。
答案 1 :(得分:0)
请注意,最后我做的是放弃杰克逊并编写我自己更简单的基于javax.json的框架,它只是以更简单的方式完成了我想要的各种序列化。我只处理简单的DTO(数据传输对象)类,所以编写我自己的简单框架要简单得多。