首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >@JsonMerge使用列表检查是否存在

@JsonMerge使用列表检查是否存在
EN

Stack Overflow用户
提问于 2018-06-08 12:15:42
回答 1查看 461关注 0票数 1

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

根据文档“集合的合并很简单:附加条目;不检查是否存在”。

然而,因为我们正在合并JPA实体,所以我们不能使用Set (由于延迟加载的问题),我们必须使用List。

问题是,在使用Collection时,我们如何检查是否存在?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 04:32:32

我们最终解决了这个问题,实现了一个自定义的集合反序列化程序,它简单地从集合中删除了“重复”对象。

我不认为它是理想的,但它完美地满足了我们的需求。

在这里发布代码,以防对其他人有用。

代码语言:javascript
复制
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调用它,如下所示:

代码语言:javascript
复制
public JsonDeserializer<?> modifyCollectionDeserializer(DeserializationConfig config, CollectionType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
    return new UniqueCollectionDeserializer((CollectionDeserializer) deserializer);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50753283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档