Пользовательский список преобразования JSON <-> Карта с Джексоном - PullRequest
0 голосов
/ 22 октября 2018

Мой вопрос касается сериализации / десериализации 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 enter image description here Сериализация проходит нормально, когда идентификатор поля используется в качестве ключа карты:

{

"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"}}}

но при десериализации я получаю другой объект

enter image description here

Чтобы десериализация работала нормально, мне нужно написать специальный преобразователь для класса 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)

Знаете ли вы способ добиться этого преобразования, которое может работать независимо от содержимого коллекции?

Спасибо за вашу помощь!

Надер

...