我使用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]....]
我对这些方括号的问题是,当我尝试使用命令对象来验证数据时,由于命令对象中的变量名不包含方括号(并且我当然不能在Grails中创建一个变量名来包含这些括号)
有谁知道为什么这些括号被添加到对象的键中(当它是一个数组的值而不是键本身时)以及我可以做些什么来规避这个问题?
答案 0 :(得分:2)
此行为并非来自Grails,但是来自jQuery,请参阅http://api.jquery.com/jQuery.param/#entry-longdesc中有关序列化(tradicional与非tradicional以及默认值如何更改)的部分
我仍然发现这在jQuery中没有很好地记录,但实际上意味着数组参数会在参数名称后附加括号(我不确定是否还有其他后果)。例如,请参阅接受的答案:
What is "traditional style of param serialization' in JQuery
在使用tradicional
之前,您可以通过在true
中将ajaxSettings
设置为jQuery.ajax
来全面阻止它:
jQuery.ajaxSettings.traditional = true;
例如,在我的application.js中,我从一开始就有以下内容:
if (typeof jQuery !== 'undefined') {
...
jQuery.ajaxSettings.traditional = true;
}
另一个选择是不以表格URL编码的方式发送Javascript对象,而是在正文中发送纯JSON。执行此操作时,您可以使用request.JSON
访问控制器中已解析的JSON,这对于数据绑定非常有用:
浏览器控制台:
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
控制器:
class TestController {
def jsonTest() {
render request.JSON
}
}