我正在尝试在控制器中检索从客户端(通过ajax)以JSON格式发送的复杂对象,但我不知道如何从params获取转换了某些属性的映射。 / p>
例如,假设这是“复杂的”JSON对象(元对象中的项目数是可变的,可以是一个,两个,三个......并且具有变量名称):
{
language: "java",
meta: {
category: "category1"
}
}
当这个对象通过jQuery发送时,在控制器中我得到了params对象:
[language:java, meta[category]:category1, action: register, controller: myController]
这就是我通过jQuery发送对象的方式。我有几个电话的通用功能:
if (!params) params = {};
var url = this.urls.base+"/"+controller+"/"+action+"?callback=?";
if (params.callback)
url = this.urls.base+"/"+controller+"/"+action+"?callback="+params.callback;
url = url + "&_"+new Date();
delete params.callback;
$.ajax({
url: url,
data: params,
crossDomain:true,
dataType:'jsonp',
cache:false,
ajaxOptions: {cache: false},
jsonp: params.callback?false:true
});
并且在我发送的ajax调用的params中测试我之前写的
的JSON对象如果我尝试在控制器中执行params.meta,我会得到一个null对象。 我怎么能从params对象中检索地图?
答案 0 :(得分:4)
在客户端,您必须使用POST方法发送数据,并配置jQuery以将其作为JSON发送。像:
data = {
language: "java",
meta: {
category: "category1"
}
}
$.ajax({
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
})
以request.JSON
身份登录服务器端,请参阅文档:http://grails.org/doc/2.2.0/ref/Servlet%20API/request.html
但是,如果您需要发出跨域请求,POST方法就不起作用了。在这种情况下,您可以将复杂对象作为参数传递,并从字符串解析服务器。像:
$.ajax({
data: {myjson: JSON.stringify(data)}
})
和
def myjson = JSON.parse(params.myjson)