如何修改集合反序列化器,使其生成按给定条件筛选掉的集合?



>DOMAIN

有一个类Link

public final class Link implements Serializable {
private final String     _title;
private final String     _href;
private final List<Link> _links;
}

并且有一个类LinkDeserialiser可以从 JSON 反序列化Link对象

public final class LinkDeserialiser extends JsonDeserializer<Link> {
@Override
public Link deserialize(JsonParser parser, DeserializationContext context) throws IOException {
final JsonNode node = context.readValue(parser, JsonNode.class);
return Link.builder()
.title(node.path(Constants.TITLE).asText().trim())
.href(node.path(Constants.HREF).asText().trim())
.links(loadLinks(node.path(Constants.LINKS)))
.build();
}
}

问题

LinkDeserialiser之前,我们有一个方法

public static List<Link> readLinks(JsonNode node) {
List<Link> links = new ArrayList<>();
node.forEach(childNode -> {
Link link = new Link(childNode);
if (link.valid()) {
links.add(link);
}
});
return links;
}

已将JsonNode解析为List<Link>,并按链接有效性过滤该列表。当我们引入LinkDeserialiser时,我们找到了一种反序列化Link的正确方法,即

nodeParser.readValueAs(new TypeReference<List<Link>>() {});

但问题是,我们现在不知道将过滤器放在哪里link -> link.valid()nodeParser将使用有效和无效Link填充列表。

我宁愿不写JsonDeserializer<Collection<Link>>,这似乎是一个沉闷的想法。

问题

我很想得到以下任何问题的答案:

1( 如何修改集合反序列化器,使其生成按给定条件过滤掉的集合?

2(有没有办法使集合反序列化器"异常容忍",以便在抛出异常时,它会将对象收集到集合中?(例外是一种过滤器(

更新 1

Link#valid 是一个基本规则,无论上下文和调用者如何,都应遵循。我不想(也不能(强制调用方通过我的(私有(规则过滤获得的集合。

更新 2

CollectionDeserializer的来源

Object value;
if (t == JsonToken.VALUE_NULL) {
if (_skipNullValues) {
continue;
}
value = _nullProvider.getNullValue(ctxt);
} else if (typeDeser == null) {
value = valueDes.deserialize(p, ctxt);
} else {
value = valueDes.deserializeWithType(p, ctxt, typeDeser);
}
result.add(value);

似乎无论任何条件如何都会添加反序列化value。我正在考虑扩展类并自行过滤生成的集合。

简短而简单:解析所有条目并删除无效条目。

nodeParser.readValueAs(new TypeReference<List<Link>>() {})
.removeIf((Link link) -> !link.valid());

最新更新