2013-02-22 5 views
5

enum이 JSON으로 정렬되는 방식을 변경하고 싶습니다. 나는 현재 (JSON)을 기본 grails.converters.JSON을 사용하고 컨트롤러의 예를 들어 내가 사용 :Grails JSON 열거

FilmKind.values ​​()를 JSON

이의 출력은 다음과 같습니다

"kind":[{"enumType":"FilmKind","name":"DRAMA"},{"enumType":"FilmKind","name":"ACTION"}] 

나는 "enumType"를 제거하고 바로 돌아 싶습니다

"kind":["DRAMA","ACTION"] 

내가 아직도 내가 각 열거 개별적으로 마샬 싶지 않기 때문에 내가 JSON

를 사용할 수있는 솔루션을 찾고.

def display = [kind:[]] 
FilmKind.values().each { val -> 
    display.kind.add(val.value) 
} 

render display as JSON 

답변

10

나는 각 열거 개별적으로 마샬 싶지 않기 때문에.

여러분이 직접 JSON 변환기를 작성하고 싶지 않다면 마샬링이 가장 좋은 방법입니다. 이유는 Sergio가 제안하는 것을 수행하는 것 외에 다른 유일한 방법은 당신이 필요로하는 모든 곳에서 코드를 호출해야하기 때문입니다. FilmKind가 다른 클래스의 속성이라면 그의 솔루션은 전혀 작동하지 않습니다.

나는 마샬 러에게 제안 할 것이고, 여기 나는 그것을 어떻게 할 것인가. FilmKindMarsaller라는 클래스를 만듭니다

class FilmKindMarshaller { 
    void register() { 
    JSON.registerObjectMarshaller(FilmKind) { FilmKind filmKind -> 
     [ 
      name: filmKind.toString() 

     ] 
    } 
    } 
} 

이 그런 다음 부트 스트랩에 다음을 추가 : 위의

[ new FilmKindMarshaller() ].each { it.register() } 

다음은 당신이 필요로하는 각 Marshaller의 인스턴스를 계속 추가 할 수 있도록이다.

이제 FilmKind가 JSON으로 처리 될 때마다, 자체 또는 일부 부모 클래스에서 원하는 JSON 인 sans enumType을 얻을 수 있습니다. 경우 사람에

1

. 당신의 Bootstrap.groovy, 당신은 같은 것을 할 수 있습니다

JSON.registerObjectMarshaller(FilmKind) { 
    def result = [:] 
    def props = ['name'] 
    props.each { prop -> 
     result[prop] = it."$prop" 
    } 
    result 
} 
+0

감사합니다! 이것은 좋았습니다. val.name 대신 val을 약간 조정해야했습니다. val.value를 사용해야합니다. 하지만 여전히 낮은 수준에서이를 수행하는 솔루션을 원하므로 모든 곳에서 작성할 필요가 없습니다. 또한 문제는 열거 형의 속성을 포함하는 도메인 객체에서 'as JSON'을 수행 할 때 할당 된 열거 형 값이 여전히 'enumType'과 함께 전송되는 경우입니다. – MBozic

+0

더 낮은 레벨에서는 Gregg의 대답을 확인하십시오. –

2

당신은 as JSON을 허용하는 도메인 클래스에 사용자 지정 개체 마샬을 등록 할 수 있습니다에 대해 어떻게

13

는 일반적인 방법으로 일반 문자열 값으로 모든 열거 값을 변환하는 방법을 방황 : 대답에 대한

class EnumTypeHidingJSONMarshaller { 
    void register() { 
     JSON.registerObjectMarshaller(Enum) { Enum someEnum -> 
      someEnum.toString() 
     } 
    } 
} 
+5

또는 그 이하 : JSON.registerObjectMarshaller (Enum, {Enum e -> e.name()}) –

+0

Grails3에서이 작업이 가능합니까? – bitsnaps