ajax - Grails 通过向对象的键添加方括号 [] 来错误地解释发布的 JSON 数据

标签 ajax json grails

我正在使用 AJAX 调用从客户端将数据发布到服务器。发送到服务器的数据采用 JavaScript 对象的形式,其结构如下:

var dataObj = {
        data: roleList,
        count: count,
        units: unitList
    }

并通过 JQuery Ajax 调用发布到服务器。

问题在于,当服务器接收到数据时,Grails 会向数据中的键和值添加方括号。例如,当我在服务器上打印出“params”时,它看起来像这样:

[data[]:[data1, data2, data3], count: 3, units[]:[unit1,unit2]]

而它应该看起来像:

[data:[data1,data2,data3]....]

这些方括号的问题是,当我尝试使用命令对象来验证数据时,数据绑定(bind)无法发生,因为命令对象中的变量名称不包含方括号(并且我当然无法在 Grails 中创建变量名来包含这些括号)

有谁知道为什么这些括号被添加到对象中的键中(当它是数组而不是键本身的值时)以及我可以采取什么措施来规避这个问题?

最佳答案

此行为不是来自 Grails,而是来自 jQuery,请参阅 http://api.jquery.com/jQuery.param/#entry-longdesc 中有关序列化的部分(传统与非传统以及如何更改默认值)

我仍然发现这在 jQuery 中没有得到很好的记录,但实际上意味着数组参数将括号附加到参数名称上(我不确定是否有其他后果)。例如,请参阅已接受的答案:

What is "traditional style of param serialization' in JQuery

在使用jQuery.ajax之前,您可以通过在ajaxSettings中将tradicional设置为true来全局阻止它:

jQuery.ajaxSettings.traditional = true;

例如,在我的 application.js 中,我一开始就有以下内容:

if (typeof jQuery !== 'undefined') {
   ...
   jQuery.ajaxSettings.traditional = true;
}

另一种选择是不以表单 URL 编码方式发送 Javascript 对象,而是在正文中以纯 JSON 形式发送。执行此操作时,您可以使用 request.JSON 访问 Controller 中解析后的 JSON,这对于数据绑定(bind)非常有用:

浏览器控制台:

jQuery.ajax({
    type: 'POST', 
    url: 'http://localhost:8080/test/jsonTest', 
    data: JSON.stringify({a: 1, b:2}), 
    async: false,
    contentType: "application/json; charset=utf-8"
}).responseText

Controller :

class TestController {
   def jsonTest() {
      render request.JSON
   }
}

关于ajax - Grails 通过向对象的键添加方括号 [] 来错误地解释发布的 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31651992/

相关文章:

jquery - 在 Django/jQuery 中验证弹出窗口中的表单而不重新加载页面

javascript - 用户提交弹出表单时发送多个ajax调用

jQuery Ajax setTimeout JSON

grails - 在Grails 3.1.7中使用Rest Profile时,如何设置默认的URL映射?

Grails + Gpars.memoize().. 如何做内存?

javascript - 发送 AJAX 请求 - 无法开始工作

arrays - 在 postgres 中查询 JSON[] 类型

java - 具有 JSON 表示语法的 WADL

grails - Grails邮件传递在本地工作正常,但在具有相同配置的实时服务器(Jelastic)上失败

javascript - 有什么办法可以查出某个按钮是否在跨域子窗口中被点击?