gpt4 book ai didi

java - 是否可以使用非默认构造函数的 Jackson 自定义解串器?

转载 作者:搜寻专家 更新时间:2023-11-01 03:55:34 25 4
gpt4 key购买 nike

假设我有以下类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com