我正在研究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
以反序列化为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。