我正在开发一个序列化器,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>
构造一个JavaType
with TypeFactory.constructParametricType
。
我正在使用杰克逊 2.9.4。