如果我想从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是否支持更聪明的方式来传播类型强制。
答案 0 :(得分:0)
我目前还不知道更好的方法。我们可以为JsonSlurper结果编写一个外部访问者类型的处理器,但这将是更多的代码