Grails Enumeration to JSON

MBo*_*zic 5 grails json enumeration marshalling

我想改变枚举被编组为JSON的方式.我目前正在使用默认的grails.converters.JSON(作为JSON),例如在我使用的控制器中:

FilmKind.values()为JSON

这个输出是:

"kind":[{"enumType":"FilmKind","name":"DRAMA"},{"enumType":"FilmKind","name":"ACTION"}]
Run Code Online (Sandbox Code Playgroud)

我想删除"enumType"并返回:

"kind":["DRAMA","ACTION"]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个仍然允许我使用的解决方案

作为JSON

因为我不想单独编组每个枚举.

小智 16

如果有人徘徊如何以通用方式将所有枚举值转换为纯字符串值:

class EnumTypeHidingJSONMarshaller {
    void register() {
        JSON.registerObjectMarshaller(Enum) { Enum someEnum ->
            someEnum.toString()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 或更短:JSON.registerObjectMarshaller(Enum,{Enum e - > e.name()}) (6认同)

Gre*_*egg 11

因为我不想单独编组每个枚举.

好吧,除非您想编写自己的JSON转换器,否则编组是最好的方法.原因是因为唯一真正的另一种方式是做塞尔吉奥所建议的,你必须在任何你需要的地方调用该代码.如果FilmKind是另一个类的属性,那么他的解决方案根本不会起作用.

我会建议Marshallers,我会这样做.创建一个名为FilmKindMarsaller的类:

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

      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后将以下内容添加到Bootstrap中:

[ new FilmKindMarshaller() ].each { it.register() }
Run Code Online (Sandbox Code Playgroud)

以上是你可以继续添加你需要的每个Marshaller的实例.

现在,只要FilmKind是JSON'ified,无论是它自己还是父类的一部分,你都可以得到你想要的JSON,而不是enumType.