假设我有以下类(class):
public class Person {
String name;
Set<Department> departments;
}
public class Department {
String code;
String name;
}
所以我想写一个自定义的 Department 反序列化器,以便在 Person 类中注释 deparments 字段以使用它。因为此自定义反序列化器将仅用于反序列化 Person 对象内的 Department 对象。问题是我的自定义 Department 反序列化器需要有一个必须在反序列化器的构造函数中传递的 DepartmentRepository。我怎样才能做到这一点?这可能吗?我不想在对象映射器中注册反序列化器,因为它只能在 Person 类的 deparatments 字段被反序列化时使用。
更新:除了用带有参数 contentUsing = MyCustomDepartmentDeserializer.class 的 JsonDeserialize 注释来注释部门字段之外,我需要的是一种告诉 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!
}
}
最佳答案
首先要做的事情:指定反序列化器用于您可以使用的数组的内容
@JsonDeserialize(contentUsing=MyDeserializer.class)
Set<Department> departments;
指定反序列化器用于相关集合的内容。
至于使用非默认构造函数的能力,@JsonCreator 允许这样做。 但是要传递上下文对象,您可能需要 Jackson 1.9(请参阅“Jackson 1.9 overview”),它允许“注入(inject)”JSON 之外的对象。 然后,您可以混合和匹配可注入(inject)值和 JSON 属性,例如:
public class POJO {
@JsonCreator // can also be used for static factory methods
public POJO(@JacksonInject DepartmentRepository repo, @JsonProperty("value") int value) {
....
}
}
这可能足以满足您的要求。
关于java - 是否可以使用非默认构造函数的 Jackson 自定义解串器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781203/