4

我希望每个对 post-request 的 JSON 响应都包含一个 field success。在那里添加此字段的最佳方法是什么?

我使用这样的代码来生成 JSON 响应:

try {
    def entity = myService.saveEntity(arg1,arg2)
    render entity as JSON //I want to add artificial field 'success = "yes"' here
} catch (ValidationException e) {
    render parseErrors(e.errors) as JSON //field 'success = "no"' here
}
4

3 回答 3

8

这周我只是在这个确切的问题上苦苦挣扎。我想将域类作为 JSON 发回,但同时添加一个可能包含其他信息的“errorMessage”属性。

事实证明,当在 grails 中用作 JSON时,它会发回一个转换器对象,但可以使用JSON.parse()将该转换器实例转换为 jsonObject ,我们可以轻松地向其中添加新值。

def jsonObject = JSON.parse((entity AS JSON).toString())
jsonObject.put("success", "yes")
render jsonObject as JSON

我认为有几种不同的方法,但这对我来说是最简单的,因为我已经为我的大多数域类提供了自定义转换器,并且我不想向我的域对象添加任何其他瞬态属性。

于 2012-08-10T16:11:10.253 回答
5

您能否返回一个包含该success字段的地图,并将该对象包装在一个单独的变量中:

try {
    def entity = myService.saveEntity(arg1,arg2)
    render [ success:'yes', val:entity ] as JSON
} catch (ValidationException e) {
    render [ success:'no', val:parseErrors(e.errors) ] as JSON
}

没测试过吧。。。

于 2012-05-23T09:43:38.597 回答
4

您可以注册自己的 JSON 编组器(例如,在BootStrap.groovy),例如:

JSON.registerObjectMarshaller(MyEntity) { MyEntity it ->
  return [
    someField : it.someField, // you should specify fields for output, or put all '.properties'
    success   : true // as I understand you always have 'true' for real entity
  ]
}

MyEntity您要使用的课程在哪里

于 2012-05-23T09:59:50.700 回答