Я работаю над сериализатором для 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
с TypeFactory.constructParametricType
.
Я использую Джексон 2.9.4.
JsonParser.readAsValue(ResolvedType)
, который кажется легко достижимым и который я предложил на github.com/FasterXML/jackson-databind/issues/1966. - person Karl Richter   schedule 11.03.2018