绕过通用映射序列化器的运行时类型擦除

时间:2018-03-10 20:17:21

标签: java jackson jackson2 jackson-databind

我正在研究Map<K,V>的序列化程序,它将地图条目序列化为JSON对象数组keyvalue能够包含任意类型(包括键的复杂类型) )。我有

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以反序列化为Map之外,其他工作正常工作。

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

所以,我想知道是否有办法实现通用解决方案,例如通过Class<? extends K>Class<? extends V>并使用JavaType构建TypeFactory.constructParametricType

我正在使用Jackson 2.9.4。

0 个答案:

没有答案