我正在使用 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/