自定义JSON转换列表<->使用Jackson映射

时间:2018-10-22 16:49:09

标签: java json serialization jackson deserialization

我的问题是关于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实例 enter image description here 这样序列化就很好了,其中字段ID用作映射的键​​:

{

“名称”:“皮埃尔”,   “年龄”:55岁   “地址”:{     “ 1”:{       “ id”:1       “ street”:“共和国街”,       “ city”:“ Geneve”,       “ type”:“ HOME”     },     “ 2”:{       “ id”:2       “ street”:“ rue du lac”,       “ city”:“ Paris”,       “ type”:“ OFFICE”     }   } }

但是在反序列化时,我得到了另一个对象

enter image description here

为了使反序列化工作正常,我必须为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)

您知道一种可以实现此转换的方法吗,无论集合中的内容是什么,该转换都可以工作?

谢谢您的帮助!

纳德

0 个答案:

没有答案