【问题标题】:Grails Enumeration to JSONGrails 枚举到 JSON
【发布时间】:2013-02-22 18:25:54
【问题描述】:

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

FilmKind.values() 为 JSON

这个输出是:

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

我想删除“enumType”并返回:

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

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

作为 JSON

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

【问题讨论】:

    标签: json grails marshalling enumeration


    【解决方案1】:

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

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

    【讨论】:

    • 或更短:JSON.registerObjectMarshaller(Enum, { Enum e -> e.name() })
    【解决方案2】:

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

    好吧,除非您想编写自己的 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。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        怎么样:

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

        【讨论】:

        • 感谢您的回答!这很好,我只需要稍微调整一下,而不是 val.name ,必须使用 val.value 。但是我仍然想要一个在较低级别上执行此操作的解决方案,因此我不必到处都写它。另外问题是当我在包含枚举类型属性的域对象上执行“as JSON”时,分配的枚举值仍然与“enumType”一起发送。
        • 对于较低级别的检查 Gregg 的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多