5

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

FilmKind.values() 作为 JSON

这个的输出是:

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

我想删除“enumType”并返回:

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

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

作为 JSON

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

4

4 回答 4

16

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

class EnumTypeHidingJSONMarshaller {
    void register() {
        JSON.registerObjectMarshaller(Enum) { Enum someEnum ->
            someEnum.toString()
        }
    }
}
于 2014-11-11T13:05:13.753 回答
12

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

好吧,除非您想编写自己的 JSON 转换器,否则编组是最好的方法。原因是因为唯一真正的其他方法是按照 Sergio 的建议进行操作,并且您必须在需要的任何地方调用该代码。如果 FilmKind 是另一个类的属性,那么他的解决方案将根本不起作用。

我会建议 Marshallers,这就是我的做法。创建一个名为 FilmKindMarsaller 的类:

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

      ]
    }
  }
}

然后将以下内容添加到您的引导程序中:

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

以上是为了让您可以继续添加您需要的每个 Marshaller 的实例。

现在,只要 FilmKind 是 JSON 化的,无论是它自己还是父类的一部分,你都会得到你想要的 JSON,没有 enumType。

于 2013-02-22T19:17:51.530 回答
3

您可以为您的域类注册一个自定义对象编组器以允许as JSON. 在您的Bootstrap.groovy中,您可以执行以下操作:

JSON.registerObjectMarshaller(FilmKind) {
    def result = [:]
    def props = ['name']
    props.each { prop ->
        result[prop] = it."$prop"
    }
    result
}
于 2013-02-22T19:16:58.113 回答
1

怎么样:

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

render display as JSON
于 2013-02-22T18:32:21.773 回答