Полиморфизм применительно к 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.

[sc:social_networks]
You can leave a response, or trackback from your own site.

Leave a Reply