【问题标题】:How to get at JSON in grails 2.0如何在 grails 2.0 中获取 JSON
【发布时间】:2012-03-25 20:42:52
【问题描述】:

我正在使用 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 回答“是”,但我不能用 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")

当我尝试答案时,看看参数在空指针异常的末尾看起来多么奇怪:

[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 编组的一部分。这对于我修改这些值的目的有点不方便。我如何将所有这些单独的参数返回到嵌套地图和列表的大型 groovy 对象中?

也许我没有用 jQuery 做我想做的事?

更新 jQuery 是问题所在:Grails: where does request.JSON come from, and how do I put things there with jQuery's .ajax() or .post()?

【问题讨论】:

  • 你试过params.list('listObjects')吗?这是访问列表参数的正确方法。
  • println params.list('listObjects') 打印 []

标签: jquery ajax json grails


【解决方案1】:

对不起,如果 2.0 改变了这种行为,但在 1.3.7 中,我使用以下内容来解析 JSON 数据:

request.JSON.each {params  ->
...

试试这个。

【讨论】:

  • 不确定我是否做得对:我将它添加到我的控制器中,但我收到了错误:Missing value. at character 0 of .
  • 你完成关闭了吗?
  • 将调试放在操作的顶部:log.debug("Incoming: "+request.JSON)
  • 该行因同样的错误而崩溃,我很确定这是 grails 2.0 的东西,请参阅我的 update2。
  • 这就是我想要的,但是 jQuery 以某种方式搞乱了调用。
【解决方案2】:

如果您要将 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)
}

无需解析您的参数或任何东西。这当然是假设您可以将 JSON 构建为域。

【讨论】:

  • 这很好用,但在这种情况下,我实际上想处理一大堆不是我的域对象之一的 JSON 数据。会 +1,但我的问题实际上出在 jQuery 中。
  • 确保您将要使用 params.product 设置的 Product 中的哪些字段列入白名单。否则这可能是一个安全漏洞。
【解决方案3】:

params 总是以字符串形式出现,因此您需要做一些事情来将输入转换为实际列表。您可以使用grails.converters.JSON.parse(params.listThing) 来执行此操作。

【讨论】:

  • println params.listThing 打印 null 并将其提供给 JSON 解析器会导致空指针异常。
猜你喜欢
  • 2011-10-31
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多