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

时间:2015-07-27 11:33:00

标签: 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]....]

我对这些方括号的问题是,当我尝试使用命令对象来验证数据时,由于命令对象中的变量名不包含方括号(并且我当然不能在Grails中创建一个变量名来包含这些括号)

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

1 个答案:

答案 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
   }
}