1

我正在开发一个序列化器,Map<K,V>它将映射条目序列化为 JSON 对象数组,key并且value能够包含任意类型(包括键的复杂类型)。我有

public class MapEntryDeserializer<K,V> extends StdDeserializer<Map<K,V>> {
    private static final long serialVersionUID = 1L;

    public MapEntryDeserializer(Class<Map<K,V>> vc) {
        super(vc);
    }

    public MapEntryDeserializer(JavaType valueType) {
        super(valueType);
    }

    @Override
    public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        Map<K,V> retValue = new HashMap<>();
        List<Entry<K,V>> entries = p.readValueAs(new TypeReference<List<Entry<K,V>>>() {});
        for(Entry<K,V> entry : entries) {
            retValue.put(entry.getKey(),
                    entry.getValue());
        }
        return retValue;
    }

    private static class Entry<K,V> {
        private K key;
        private V value;

        public Entry() {
        }

        public K getKey() {
            return key;
        }

        public void setKey(K key) {
            this.key = key;
        }

        public V getValue() {
            return value;
        }

        public void setValue(V value) {
            this.value = value;
        }
    }
}

除了在运行时new TypeReference<List<Entry<K,V>>>解析为List<Entry<Object, Object>>,因此嵌套Entity2的 s 被反序列化为Map.

{
  "id" : 1,
  "valueMap" : [ {
    "key" : {
      "type" : "richtercloud.jackson.map.custom.serializer.Entity2",
      "id" : 2
    },
    "value" : 10
  } ]
}

所以,我想知道是否有办法实现通用解决方案,例如传递Class<? extends K>Class<? extends V>构造一个JavaTypewith TypeFactory.constructParametricType

我正在使用杰克逊 2.9.4。

4

0 回答 0