gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:01:02 24 4
gpt4 key购买 nike

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

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

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

问题在于,当服务器接收到数据时,Grails 会在数据中的键和值中添加方括号。例如,当我在服务器上打印出“参数”时,它看起来像这样:
[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

您可以通过设置 tradicional 来全局阻止它。至trueajaxSettings使用前jQuery.ajax :
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com