如何在grails 2.0中获得JSON
我用jQuery发送自己的JSON:
$.ajax ({ type: "POST", url: 'http://localhost:8080/myproject/myController/myAction', dataType: 'json', async: false, //json object to sent to the authentication url data: {"stuff":"yes", "listThing":[1,2,3], "listObjects":[{"one":"thing"},{"two":"thing2"}]}, success: function () { alert("Thanks!"); } })
我发送给控制器然后做
println params
而且我知道我已经遇到麻烦了……
[stuff:yes, listObjects[1][two]:thing2, listObjects[0][one]:thing, listThing[]:[1, 2, 3], action:myAction, controller:myController]
我无法弄清楚如何获得这些价值的大部分……
我可以用params.stuff获得“yes”,但我不能做params.listThing.each {}或params.listObjects.each {}
我究竟做错了什么?
更新:
我让控制器执行此操作以尝试到目前为止的两个建议:
println params println params.stuff println params.list('listObjects') println params.listThing def thisWontWork = JSON.parse(params.listThing) render("omg l2json")
当我尝试答案时,看看参数在空指针exception结束时看起来有多奇怪:
[stuff:yes, listObjects[1][two]:thing2, listObjects[0][one]:thing, listThing[]:[1, 2, 3], action:l2json, controller:rateAPI] yes [] null | Error 2012-03-25 22:16:13,950 ["http-bio-8080"-exec-7] ERROR errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [POST] /myproject/myController/myAction - parameters: stuff: yes listObjects[1][two]: thing2 listObjects[0][one]: thing listThing[]: 1 listThing[]: 2 listThing[]: 3
更新2我正在学习东西,但这不可能是正确的:
println params['listThing[]'] println params['listObjects[0][one]']
版画
[1, 2, 3] thing
看起来这是grails新JSON编组的一部分。 这有点不方便我的目标是黑客攻击价值观。 如何将所有这些单独的参数重新放回嵌套地图和列表的大型常规对象中?
也许我没有用jQuery做我想做的事情?
更新jQuery是个问题: Grails:request.JSON来自哪里,我如何用jQuery的.ajax()或.post()放置它?
很抱歉,如果2.0已更改此行为,但在1.3.7中,我使用以下内容来解析JSON数据:
request.JSON.each {params -> ...
试一试。
如果你要将JSON发送回控制器,那么你最好的办法就是让Grails麻烦它,让你回到对象中。
请注意下面的parseRequest属性
"/product/$id"(controller: "product", parseRequest: true) { action = [GET: "show", PUT: "update", DELETE: "delete", POST: "save" }
然后在你的控制器中它很简单:
def save = { def productInstance = new Product(params.product) }
无需解析你的params或任何东西。 这当然是假设您可以将JSON构建到域。
params
总是以字符串forms出现,因此您需要做一些事情来将输入转换为实际列表。 您可以使用grails.converters.JSON.parse(params.listThing)
执行此grails.converters.JSON.parse(params.listThing)
。