繁体   English   中英

@JsonMerge用List检查是否存在

[英]@JsonMerge check existence with List

我们正在实现Jackson 2.9的@JsonMerge批注。

按照文档“集合的合并很简单:附加条目;不应用对存在性的检查”。

但是,由于我们要合并JPA实体,因此不能使用Set(由于延迟加载的问题),必须使用List。

问题是,使用集合时如何检查是否存在?

最后,我们通过实现一个自定义的集合反序列化器解决了这一问题,该反序列化器仅从集合中删除“重复”对象。

我认为这并不理想,但可以完美满足我们的需求。

在这里发布代码,以防他人使用。

public class UniqueCollectionDeserializer extends CollectionDeserializer {
    public UniqueCollectionDeserializer(
        JavaType collectionType,
        JsonDeserializer<Object> valueDeser,
        TypeDeserializer valueTypeDeser,
        ValueInstantiator valueInstantiator
    ) {
        super(collectionType, valueDeser, valueTypeDeser, valueInstantiator);
    }

    protected UniqueCollectionDeserializer(
        JavaType collectionType,
        JsonDeserializer<Object> valueDeser,
        TypeDeserializer valueTypeDeser,
        ValueInstantiator valueInstantiator,
        JsonDeserializer<Object> delegateDeser,
        NullValueProvider nuller,
        Boolean unwrapSingle
    ) {
        super(collectionType, valueDeser, valueTypeDeser, valueInstantiator, delegateDeser, nuller, unwrapSingle);
    }

    public UniqueCollectionDeserializer(CollectionDeserializer defaultDeserializer) {
        super(defaultDeserializer);
    }

    @Override
    public Collection<Object> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
        return removeDuplicates(super.deserialize(jsonParser, context));
    }

    @Override
    public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt, Collection<Object> result) throws IOException {
        return removeDuplicates(super.deserialize(p, ctxt, result));
    }

    @SuppressWarnings("unchecked")
    @Override
    protected CollectionDeserializer withResolved(
        JsonDeserializer<?> dd,
        JsonDeserializer<?> vd,
        TypeDeserializer vtd,
        NullValueProvider nuller,
        Boolean unwrapSingle
    ) {
        return new UniqueCollectionDeserializer(_containerType, (JsonDeserializer<Object>) vd, vtd, _valueInstantiator, (JsonDeserializer<Object>) dd, nuller, unwrapSingle);
    }

    private Collection<Object> removeDuplicates(Collection<Object> data) {
        return data.stream()
                .distinct()
                .collect(Collectors.toList());
    }
}

像这样从BeanDeserializerModifier调用它:

public JsonDeserializer<?> modifyCollectionDeserializer(DeserializationConfig config, CollectionType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
    return new UniqueCollectionDeserializer((CollectionDeserializer) deserializer);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM