在Groovy中键入字符串集合的强制到枚举的集合

时间:2014-12-18 11:13:41

标签: json collections groovy enums type-coercion

如果我想从JSON解析为域对象,我已经定义了包含枚举的集合,我发现Groovy不会自动强制收集集合的内容,我认为不应该这样做泛型是一个编译时间问题。

如果我天真地对已解析的JSON进行类型强制,我的集合将在运行时包含字符串,这将使得与枚举的集合元素的比较失败,无论其值如何。

另一种方法是覆盖枚举集合的setter并对每个元素进行强制。这在以下示例中说明。

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 

重写的setter方法解决了我的问题,但它似乎有点香草,我想知道Groovy是否支持更聪明的方式来传播类型强制。

1 个答案:

答案 0 :(得分:0)

我目前还不知道更好的方法。我们可以为JsonSlurper结果编写一个外部访问者类型的处理器,但这将是更多的代码