Java Jackson:在反序列化期间传递exta对象
在反序列化过程中,如何传入初始化某个类成员所需的额外对象?如果我“手动”进行反序列化,则实现可能如下所示:Java Jackson:在反序列化期间传递exta对象,java,jackson,Java,Jackson,在反序列化过程中,如何传入初始化某个类成员所需的额外对象?如果我“手动”进行反序列化,则实现可能如下所示: public class MyClass { private MyDocumentObject do; private String food; public MyClass(JsonNode node, MyDocument document) { this.do = document.createMyDocumentObject();
public class MyClass {
private MyDocumentObject do;
private String food;
public MyClass(JsonNode node, MyDocument document) {
this.do = document.createMyDocumentObject();
this.food = node.get("food").asText();
}
public String getFood() {
return this.food;
}
}
但我希望使用Jackson的自动映射工具,使用修饰的构造函数或自定义反序列化器等,并避免在类本身中实现反序列化。查看使用@JsonCreator
或扩展StdDeserializer
的示例实现,我看不到一种说法“嘿,请在调用构造函数时使用这个MyDocument
对象。”我希望避免实现和公开一个单独的方法,该方法接受我必须在每个反序列化对象上调用的MyDocument
,例如
public createDocumentObject(MyDocument document) {
this.do = document.createMyDocumentObject();
}
我根本不想使用这个方法,但如果我必须这样做,我希望Jackson在反序列化之后立即为我调用这个方法。这意味着我仍然必须告诉Jackson要使用哪个
MyDocument
。怎么样:您的所有类都扩展了一个具有MyDocumentObject
的公共抽象类,并且您为您的抽象类声明了一个自定义反序列化器?我不知道抽象类对这个问题有什么好处,但我想实际上有一个非常简单的解决方案,只需在反序列化器的构造函数中添加MyDocument
:ObjectMapper mapper=new ObjectMapper();SimpleModule=新的SimpleModule();module.addDeserializer(MyClass.class,新的MyClassDeserializer(document));映射器注册表模块(模块)代码>怎么样:你所有的类都扩展了一个普通的抽象类,这个抽象类有MyDocumentObject
,你为你的抽象类声明了一个自定义反序列化程序?我不知道抽象类对这个问题有什么好处,但我想实际上有一个非常简单的解决方案,只需在反序列化器的构造函数中添加MyDocument
:ObjectMapper-mapper=new-ObjectMapper();SimpleModule=新的SimpleModule();module.addDeserializer(MyClass.class,新的MyClassDeserializer(document));映射器注册表模块(模块)代码>