假设我有以下类:
public class Person {
String name;
Set<Department> departments;
}
public class Department {
String code;
String name;
}
所以我想写一个自定义的Department反序列化器,以便注解Person类中的departments字段来使用它。因为这个自定义的反序列化器只用于反序列化Person对象中的Department对象。问题是我的自定义Department反序列化器需要有一个DepartmentRepository,它必须在反序列化器的构造函数中传递。我该怎么做?这可能吗?我不知道。我不想在对象Map器中注册反序列化程序,因为只有当Person类的deparatments字段被反序列化时,才必须使用它。
**UPDATE:**我需要的是,除了使用参数contentUsing = MyCustomDepartmentDeserializer.class的JsonDeserialize注解来注解departments字段之外,还需要一种方法来告诉Jackson,当它建立MyCustomDepartmentDeserializer对象时,必须呼叫接收DepartmentRepository的建构函式来完成。这个反序列化程式可能如下所示:
public class MyCustomDepartmentDeserializer extends JsonDeserializer<Department> {
private final DepartmentRepository departmentRepository;
public MyCustomDepartmentDeserializer(DepartmentRepository departmentRepository) {
this.departmentRepository = departmentRepository;
}
@Override
public Department deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
//IMPLEMENTATION!
}
}
5条答案
按热度按时间ny6fqffe1#
首先要做的是:若要指定要用于数组内容的还原序列化程式,您可以使用
以指定要用于相关集合内容的反序列化程序。
至于使用非默认构造函数的能力,@JsonCreator允许这样做。但是要传递一个上下文对象,你需要Jackson1.9可能是你的朋友(参见“Jackson 1.9 overview“),它允许“注入”JSON之外的对象。然后你可以混合和匹配可注入的值和JSON属性,例如:
这可能足以满足您的要求。
btxsgosb2#
您可以使用
ObjectMapper
将自订序列化程式/还原序列化程式注册为模块,以加入具有非预设建构函式的自订序列化程式/还原序列化程式。如果
MyObject
类中有注解,还应该将其删除。erhoui1w3#
这是我刚写的一个反序列化器。注意非默认构造函数的使用。
请注意,在建立还原序列化程式并将它加入至模块时,您可以使用任何您喜欢的建构函式模式。
xxb16uws4#
不,在最开始的时候,你可以不指定一个自定义的反序列化器;Jackson可以检测嵌套字段并正确Map它们,* 只有当所有模型类都实现
Serializable
* 时。所以,把
implements Serializable
加到Department
和Person
上,你就会看到Jackson的作品开箱即用。vfh0ocws5#
我相信您可以使用Jackson中的注解来标识要公开的属性。