Мой вопрос касается сериализации / десериализации JSON с Джексоном. По какой-то причине нам нужно сериализовать список объектов в виде карты, где ключом является поле, помеченное @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 Сериализация проходит нормально, когда идентификатор поля используется в качестве ключа карты:
{
"name": "Pierre", "age":55, "адреса": {"1": {"id": 1, "улица": "rue de la republique", "city": "Geneve", "type": "HOME"}, "2":{"id": 2, "street": "rue du lac", "city": "Paris", "type": "OFFICE"}}}
но при десериализации я получаю другой объект
Чтобы десериализация работала нормально, мне нужно написать специальный преобразователь для класса Address
открытый класс MapToAddressConvertor extends 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.Обратите внимание, что я не могу использовать classe GenericMapToList в качестве конвертера, например,
@JsonDeserialize(converter = GenericMapToList<Map<String, Address>, List<Address>>.class)
Знаете ли вы способ добиться этого преобразования, которое может работать независимо от содержимого коллекции?
Спасибо за вашу помощь!
Надер