Из-за весьма неудобных особенностей одной из внешних служб мне пришлось городить огород на своей стороне. А именно: поле с одним и тем же именем с двух разных ссылок передается в json в виде списка и в виде ассоциативного массива (LinkedHashMap).
Вот как это выглядит:
"services":["SERVICE3", "SERVICE_EXT"]
"services":{"SERVICE3":"1234", "SERVICE_EXT":"434"} |
"services":["SERVICE3", "SERVICE_EXT"]
"services":{"SERVICE3":"1234", "SERVICE_EXT":"434"}
Мне очень не хотелось делать две разные сущности (по одной для каждой ссылки) из-за усложнения поддержки. К тому же, само содержимое поля нужно только для поиска по нему. Т.е. мне надо выяснить, есть ли в каждой коллекции ключ "SERVICE_EXT" - сопоставляемое с ним значение "434" неважно. И тут выяснилось, что на помощь придёт полиморфизм.
В сущности нужно объявить свойство 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> |
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.