Полиморфизм применительно к json

Из-за весьма неудобных особенностей одной из внешних служб мне пришлось городить огород на своей стороне. А именно: поле с одним и тем же именем с двух разных ссылок передается в 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.
You can leave a response, or trackback from your own site.

Leave a Reply