2014-12-18 5 views
4

JSON을 도메인 객체로 구문 분석하려는 경우 열거 형 컬렉션을 포함하도록 정의 했으므로 Groovy가 컬렉션의 내용을 강제 변환하지 않는다는 것을 알았습니다 자동으로 제네릭은 컴파일 타임의 문제이므로 예상하지 말아야한다.Groovy의 열거 형 컬렉션으로 문자열 모음 강제 변환

구문 분석 된 JSON에 강제로 형식을 지정하면 런타임에 컬렉션에 문자열이 포함되어 값과 상관없이 컬렉션 요소와 열거 형을 비교하지 못하게됩니다.

대체 방법은 enum 컬렉션에 대한 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 

재정의 세터 방식

내 문제를 해결하지만, 약간의 바닐라 있다는 것, 그리고 그루비는 타입 강제 변환을 전파하는 현명한 방법을 지원하는 경우 궁금 해서요.

답변

0

저는 현재 더 좋은 방법을 모르겠습니다. 우리는 JsonSlurper 결과를 위해 외부 방문자 종류의 프로세서를 작성할 수 있지만 코드가 더 많을 것입니다.

+0

죄송합니다. 실수를했습니다 ... 답변을 변경했습니다. – blackdrag