【问题标题】:grails render collection as single json objectgrails 将集合呈现为单个 json 对象
【发布时间】:2012-06-05 13:50:47
【问题描述】:

例如我有下一个域类

User{
   String name
}

我也有这个类的 2 个对象

new User(name: "John").save()
new User(name: "Alex").save()

应该如何在 UserController 中查看“列表”操作以像这样以 JSON 格式表示 User.list()

{1: "John", 2: "Alex"}

让我更准确地说。我想要这样的东西:

UserController{
   def list = {
    render(contentType: "text/json") {
        User.list().each {user->
            user.id = user.name
        }
    }
}

但遗憾的是,这不起作用。

【问题讨论】:

    标签: json grails


    【解决方案1】:

    试试数组结构,

    def list = {
        render(contentType: "text/json") {
            results = array {
                User.list().each {user->
                    result "${user.id}" : "${user.name}"
                }
            }
        }
    }
    

    【讨论】:

    • 我喜欢你的想法,但它产生 [{"1":"John"},{"2":"Alex"}] 而不是 {"1":"John", "2" :"亚历克斯"}。
    • 是的,它是一个数组。这是我能做的最好的:)。你可以尝试直接使用JsonBuilder
    • 对于 GRAILS3 似乎不再工作数组;看我的回答。
    【解决方案2】:

    我找不到 JSONBuilder API 的解决方案。因此,我在 org.codehaus.jackson 的帮助下制定了我的解决方案。

    response.setContentType("text/json")
    JsonGenerator g = jsonFactory.createJsonGenerator(response.getOutputStream())
    g.writeStartObject()
    for (user in users) {
        g.writeStringField(user.id.toString(), user.name)
    }
    g.writeEndObject()
    g.close()
    

    【讨论】:

      【解决方案3】:

      当我想在 grails 中将某些内容编码为 JSON 时,我将所有内容都放在地图中:

      render ['1':john.name, '2':alex.name] as JSON
      

      【讨论】:

      • 这是在回答我的问题,但 IMO 这是糟糕的灵魂。您创建了额外的地图,而不是使用转换器 API。
      • 这并不理想,但它正在工作。并且有一些优势。我不喜欢在控制器中转换为 JSON。在生产代码中,我从控制器返回一个映射,并使用过滤器在编码为 JSON 时应用一些泛型操作(可选的漂亮打印、jsonp 包装......)。
      【解决方案4】:

      从@aldrin 回答开始,GRAILS3 json 渲染需要更正,因为array 指令不再起作用(并且更正确的是“应用程序”而不是“文本”),因此解决方案必须是

      def list = {
      def ulist = User.list()
      render(contentType: "application/json") {
          results(ulist) { user ->
                       userid  user.id
                       username  user.name
          }
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 2019-03-23
        • 1970-01-01
        相关资源
        最近更新 更多