Приведение набора строк к набору перечислений в Groovy

В тех случаях, когда я хочу выполнить синтаксический анализ из JSON в объект домена, который я определил как содержащий коллекцию перечислений, я обнаружил, что Groovy не принуждает содержимое коллекции автоматически, чего, как я полагаю, в любом случае не следует ожидать, поскольку дженерики являются проблема времени компиляции.

Если я наивно выполняю приведение типов к проанализированному JSON, мои коллекции будут содержать строки во время выполнения, что приведет к сбою сравнения элементов коллекции с перечислениями независимо от значения.

Альтернативой является переопределение установщика для коллекции enum и выполнение приведения к каждому элементу. Это показано в приведенном ниже примере.

import groovy.json.*

enum Hero {
    BATMAN, ROBIN
}

class AClass {

    Collection<Hero> heroes
}

class BClass {

    Collection<Hero> heroes

    void setHeroes(Collection heroes){
        this.heroes = heroes.collect { it as Hero }
    }
}

class CClass {

    AClass a
    BClass b
}

def json = '''
    {
        "a":
        {
            "heroes":["BATMAN", "ROBIN"]
        },
        "b":
        {
            "heroes":["BATMAN", "ROBIN"]
        }
    }

'''

def c = new JsonSlurper().parseText(json) as CClass

assert c.a.heroes[0].class == String
assert c.b.heroes[0].class == Hero 

Подход с переопределенным сеттером решает мою проблему, но кажется, что это немного ванильно, и мне было интересно, поддерживает ли Groovy более разумный способ распространения приведения типов.


person Erik Madsen    schedule 18.12.2014    source источник


Ответы (1)


В настоящее время я не знаю лучшего способа. Мы могли бы написать обработчик типа внешнего посетителя для результата JsonSlurper, но это было бы больше кода.

person blackdrag    schedule 19.12.2014
comment
Извините, я ошибся... Я изменил ответ - person blackdrag; 22.12.2014