我想创建一个包含数组的字典,并使用jquery的ajax请求将其发送到GAE。
我正在手动创建的类似于{'a':'text', 'b':'othertext','c':['texta','textb']}
的东西。
我可以在GAE上使用self.request.get接收和处理a和b,但不能使用c。
还有其他方法可以在js中创建JSON对象吗?请说明这种方法有什么不对。
答案 0 :(得分:4)
您并没有真正将JSON发送到服务器。当您将对象传递给jQuery.ajax
(或get
/ post
包装器)时,它将被序列化为GET或POST变量,而不是作为JSON发送,因此您的对象将被转换为像这样的东西:
a=text&b=othertext&c[]=texta&c[]=textb
如果您想将整个对象作为JSON传递,可以通过调用JSON.stringify
自行转换(对于不支持JSON
的浏览器,您需要包含json2.js本地对象)。然后,您可以使用您想要的任何名称将JSON编码的字符串包装在地图中:
jQuery.post(url, { json: JSON.stringify({a:'text', ...}) }, ...);
在服务器端,您可以通过调用self.request.get("json")
来访问JSON文本。然后,您必须解析JSON字符串以提取值。我对Python知之甚少,但显然你只需要导入django.utils.simplejson
并调用simplejson.loads(json)
。
答案 1 :(得分:2)
据推测,GAE的self.request.get
无法将字符串数组之类的复杂对象序列化为GET请求格式(?a=text&b=othertext...
)。
一种解决方法,虽然可能不是非常简洁,但是要自己将值序列化为JSON,然后传递:
var jsonObj = {
'a':'text',
'b':'othertext',
'cJSON': JSON.stringify(['texta', 'textb'])
};
...当然,您必须在接收端反序列化cJSON
。
答案 2 :(得分:1)
您实际上是在发送urlencoded请求参数,而不是JSON。 JQuery可能将列表编码为同一参数的多个值,这意味着您可以使用self.request.get_all
访问它,这将返回一个列表 - self.request.get
将仅返回第一个值。