java - 使用实例化的集合类型进行 jackson 反序列化而不是初始化一个新的集合类型?

标签 java jackson

如果我有课

class DTO {
    final MySet<Types> values = MySetWrapper(EnumSet.of(Types.class));

    public MySet getValues() {
        return values;
    }
}

其中MySet扩展了Set。 jackson 提示说

Cannot find a deserializer for non-concrete Collection type MySet

我明白,但我已经实例化了该集合。我想要的是 Jackson 在创建实例后为每个值调用 add ,如下所示:

DTO o = new DTO();
MySet<Types> values = o.getValues();
for (Types type : jsonArray) {
    values.add(type );
}

我不希望它尝试自行创建新集合。

最佳答案

该错误消息意味着 DTO类被配置(默认或显式)以反序列化 values输入到 DTO 的 JSON 的一部分 values DTO领域:

Cannot find a deserializer for non-concrete Collection type MySet

如果您认为 Jackson 不应该直接在此字段上执行反序列化,您可以定义一个构造函数来设置 values并且还要确保 Jackson 不会自动执行反序列化工作:要实现它,请删除该字段的 setter(或在其上添加 @JsonIgnore)以及任何将使用反射反序列化到字段的 Jackson 模块。

它会给出:

final MySet<Types> values = MySetWrapper(EnumSet.of(Types.class));

@JsonCreator
public MyFoo(Set<Types> values) { 
    this.values.addAll(values);
}

请注意,我在构造函数中指定了 Set而不是MySet (不应该成为问题,因为接口(interface)没有声明字段),否则您会遇到相同的问题,因为您没有为 MySet 定义反序列化器.
但如果你为此实现一个反序列化器,你当然可以这样做:

public MyFoo(MySet<Types> values) { 
    this.values.addAll(values);
}

关于java - 使用实例化的集合类型进行 jackson 反序列化而不是初始化一个新的集合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57292438/

相关文章:

java - 为什么我得到 java.net.SocketException : Connection reset when deploying app?

java - Android base 64 编码字符串不显示实际图像

java - Gradle中的依赖阴影

java - 如何禁用某些字段的 Jackson 序列化功能 WRITE_NUMBERS_AS_STRINGS?

java - Jackson 自定义反序列化器在 Spring Boot 中无法工作

java - Spring:没有 Hibernate Session 绑定(bind)到线程,并且配置不允许在此处创建非事务性 session

java - 如何在 Java 8 中动态进行过滤?

java - 如何设置 Netbeans 11 以在分发 jar 文件中包含 jdbc 驱动程序?

mongodb - 在 Kotlin 中,为什么 jackson 在某些情况下无法解码非注释对象而不是在其他情况下

java - 使用多个 useWrapping = false 时,Jackson XML 反序列化会跳过字段