gpt4 book ai didi

java - 如何配置 Jackson 能够反序列化特殊集合?

转载 作者:行者123 更新时间:2023-12-02 09:20:20 40 4
gpt4 key购买 nike

我想知道如何配置 Jackson 来反序列化“特殊”集合(不可变的,或收集流的结果)中包含的对象的序列化列表。

这是我的问题,由于某些原因,我需要在 Jackson 中声明反类型,因为我需要能够反序列化所有内容并取回所有类型。


public static class Sink {
private List items;

public Sink setItems(final List items) {
this.items = items;
return this;
}

public List getItems() {
return this.items;
}
}

public static void main(String[] args) throws Exception {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new AfterburnerModule());
mapper.enableDefaultTyping(NON_FINAL, JsonTypeInfo.As.PROPERTY);

String content = mapper.writeValueAsString(new Sink().setItems(List.of()));
System.out.println(content);
Sink result = mapper.readValue(content, Sink.class);
}

但这对集合有一个令人讨厌的副作用。内容值为:

{
"@class": "api.Sink",
"items": ["java.util.ImmutableCollections$ListN", []]
}

不幸的是,java.util.ImmutableCollections.*没有默认构造函数(这是有道理的)。

由 com.fasterxml.jackson.databind.exc.InvalidDefinitionException 引起:无法构造 java.util.ImmutableCollections$ListN 的实例(不存在创建者,如默认构造):找不到默认的无参数构造函数

我想知道如何强制 jackson 将此类对象反序列化为ArrayList或任何类型的列表。

我想将其配置为将列表的所有子类型反序列化为 ArrayList/LinkedList 或在序列化时更改集合的类型

(java 12/ jackson 2.9.7)

最佳答案

您可以使用特定的反序列化器来进行点化,例如使用 Mixin。

解串器的示例:

class UnmodifiableSetDeserializer extends JsonDeserializer<Set> {

@Override
public Set deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
JsonNode node = mapper.readTree(jp);
Set<Object> resultSet = new HashSet<Object>();
if (node != null) {
if (node instanceof ArrayNode) {
ArrayNode arrayNode = (ArrayNode) node;
Iterator<JsonNode> nodeIterator = arrayNode.iterator();
while (nodeIterator.hasNext()) {
JsonNode elementNode = nodeIterator.next();
resultSet.add(mapper.readValue(elementNode.traverse(mapper), Object.class));
}
} else {
resultSet.add(mapper.readValue(node.traverse(mapper), Object.class));
}
}
return Collections.unmodifiableSet(resultSet);
}
}

完整的例子可以在Spring security的CoreJacksont2Module here中找到

关于java - 如何配置 Jackson 能够反序列化特殊集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58734954/

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