Из-за весьма неудобных особенностей одной из внешних служб мне пришлось городить огород на своей стороне. А именно: поле с одним и тем же именем с двух разных ссылок передается в json в виде списка и в виде ассоциативного массива (LinkedHashMap).
Вот как это выглядит:
"services":["SERVICE3", "SERVICE_EXT"] "services":{"SERVICE3":"1234", "SERVICE_EXT":"434"} |
Мне очень не хотелось делать две разные сущности (по одной для каждой ссылки) из-за усложнения поддержки. К тому же, само содержимое поля нужно только для поиска по нему. Т.е. мне надо выяснить, есть ли в каждой коллекции ключ «SERVICE_EXT» — сопоставляемое с ним значение «434» неважно. И тут выяснилось, что на помощь придёт полиморфизм.
В сущности нужно объявить свойство services так:
private Object services; |
(при этом десериализация проставит нужный тип, это будет видно далее).
А поиск по полю services делаю так:
public static boolean checkIfExtServiceIsPresent(Object services){ if (services == null) { return false; } if (services instanceof List) { List<servicetypeenum> servicesAsList = (List<servicetypeenum>) services; return (servicesAsList.contains(ServiceEnum.SERVICE_EXT)); } else if (services instanceof LinkedHashMap){ LinkedHashMap<string, string=""> servicesAsMap = (LinkedHashMap<string, string="">) services; return (servicesAsMap.containsKey(ServiceTypeEnum.SERVICE_EXT)); } return false; } </string,></string,></servicetypeenum></servicetypeenum> |
Прошу прощения за форматирование — новый WordPress дописывает закрывающие теги, коими в том числе считает generic типы у коллекций List и LinkedHashMap.