Json Groovy中字符串集合到枚举集合的类型强制

Json Groovy中字符串集合到枚举集合的类型强制,json,collections,groovy,enums,type-coercion,Json,Collections,Groovy,Enums,Type Coercion,如果我想将JSON解析为我定义的包含枚举集合的域对象,我发现Groovy不会自动强制集合的内容,我想这是不应该的,因为泛型是编译时的问题 如果我天真地对解析后的JSON执行类型强制,我的集合将在运行时包含字符串,这将使集合元素与枚举的比较失败,而不管值是多少 另一种方法是重写枚举集合的setter并对每个元素进行强制。下面的示例对此进行了说明 import groovy.json.* enum Hero { BATMAN, ROBIN } class AClass { Co

如果我想将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 
import groovy.json*
枚举英雄{
蝙蝠侠,罗宾
}
类AClass{
收藏英雄
}
B类{
收藏英雄
虚空英雄(收集英雄){
this.heros=heros.collect{it as Hero}
}
}
类C类{
a组
b类
}
def json=''
{
“a”:
{
“英雄”:[“蝙蝠侠”、“罗宾”]
},
“b”:
{
“英雄”:[“蝙蝠侠”、“罗宾”]
}
}
'''
def c=new JsonSlurper().parseText(json)作为类
断言c.a.heroes[0]。类==字符串
断言c.b.heroes[0]。类==Hero

重写setter方法解决了我的问题,但它似乎有点普通,我想知道Groovy是否支持一种传播类型强制的更智能的方法。

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

对不起,我确实犯了一个错误。。。我改变了答案