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

标签 java deserialization jackson

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

相关文章:

java - 如何使用简单 Xml 框架反序列化表示根级数组的 xml

JSON 到 TypeScript 类实例?

java - @OneToMany getter 有时返回对象,有时返回 id(在数组中)

java - 如何验证传入的 JSON 并检查缺少的属性? [ jackson , Jersey ]

java - 在透明 Graphics2D 上用线条绘制形状以获取 png 图像

python - 属性错误 : 'NoneType' object has no attribute '_meta'

java - 使用 iText 将图像添加到 java 中的 rtf 文件

java - 序列化时如何创建虚拟 JSON 属性?

java - 如何在 Java 中将 ArrayList<ArrayList<String>> 转换为 List<List<String>>?

java - 如何使用 Java servlet 将值插入到 mysql 数据库?