域
有一个课程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());