@JsonMerge检查存在与List

时间:2018-06-08 04:15:42

标签: java jackson deserialization jackson-databind

我们正在实施Jackson 2.9的@JsonMerge注释。

根据文档"合并集合很简单:附加条目;没有应用存在的检查"。

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

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

1 个答案:

答案 0 :(得分:0)

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

我不认为这是理想的,但完全符合我们的需求。

在此处发布代码,以防其他人使用。

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);
}