grails将集合呈现为单个json对象

grails将集合呈现为单个json对象,json,grails,Json,Grails,例如,我有下一个域类 User{ String name } 我还有两个这个类的对象 new User(name: "John").save() new User(name: "Alex").save() UserController中的“list”操作应该如何以JSON格式表示User.list(),如下所示 {1: "John", 2: "Alex"} 让我更准确地说。我想要这样的东西: UserController{ def list = { render(con

例如,我有下一个域类

User{
   String name
}
我还有两个这个类的对象

new User(name: "John").save()
new User(name: "Alex").save()
UserController中的“list”操作应该如何以JSON格式表示User.list(),如下所示

{1: "John", 2: "Alex"}
让我更准确地说。我想要这样的东西:

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

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

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

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

试试数组结构

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

我找不到使用JSONBuilderAPI的解决方案。因此,我在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()

从@aldrin answer开始,GRAILS3 json呈现需要进行更正,因为
array
指令不再有效(并且更正确的是“应用程序”而不是“文本”),因此解决方案必须是

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

这是在回答我的问题,但在我看来,这是一个糟糕的想法。您正在创建额外的映射,而不是使用转换器API。这并不理想,但它正在工作。还有一些优势。我不喜欢在控制器中转换为JSON。在生产代码中,我从控制器返回一个映射,并使用过滤器在编码为JSON时应用一些泛型操作(可选的漂亮打印,jsonp包装…)。我喜欢你的想法,但它生成[{“1”:“John”},{“2”:“Alex”}],而不是{“1”:“John”,“2”:“Alex”}。是的,这是一个数组。这是我能做的最好的了:)。您可以尝试直接使用JsonBuilder,因为GRAILS3似乎不再适用于数组;看看我的答案。