我的问题是关于Jackson的JSON序列化/反序列化 由于某些原因,我们需要将对象列表序列化为Map,其中键是一个用@MyID注释的字段。我们需要能够在反序列化时重建列表。 例如让我们拥有以下类
public class MyPerson {
String name;
Long age;
@JsonSerialize(converter = CollectionToMapConvertor.class)
@JsonDeserialize(converter = MapToCollectionConvertor.class)
List<Address> adresses = new ArrayList();
}
我的转换器定义为
public class CollectionToMapConvertor extends StdConverter<Collection, Map> {
@Override
public Map convert(Collection col) {
HashMap map = new HashMap();
for (Object o : col) {
map.put(getJsonId(o), o);
}
return map;
}
}
对于以下MyPerson实例
这样序列化就很好了,其中字段ID用作映射的键:
{
“名称”:“皮埃尔”, “年龄”:55岁 “地址”:{ “ 1”:{ “ id”:1 “ street”:“共和国街”, “ city”:“ Geneve”, “ type”:“ HOME” }, “ 2”:{ “ id”:2 “ street”:“ rue du lac”, “ city”:“ Paris”, “ type”:“ OFFICE” } } }
但是在反序列化时,我得到了另一个对象
为了使反序列化工作正常,我必须为Address类编写一个特定的转换器
公共类MapToAddressConvertor扩展了GenericMapToList {
}
public class GenericMapToList<K, T> extends StdConverter<Map<K, T>, List<T>> {
private static final Logger log = LoggerFactory.getLogger(MapToListConvertor.class);
@Override
public List<T> convert(Map<K, T> map) {
List list = new ArrayList();
for (T o : map.values()) {
list.add(o);
}
log.debug("converted map {} to list {}", map, list);
return list;
}
}
@JsonSerialize(converter = CollectionToMapConvertor.class)
@JsonDeserialize(converter = MapToAddressConvertor.class)
List<Address> adresses = new ArrayList();
这项工作,但这是特定于Address类的。请注意,我不能将此类GenericMapToList用作此类转换器
@JsonDeserialize(converter = GenericMapToList<Map<String, Address>, List<Address>>.class)
您知道一种可以实现此转换的方法吗,无论集合中的内容是什么,该转换都可以工作?
谢谢您的帮助!
纳德