使用javascript的GoogleAppEngine JSON对象

时间:2010-08-02 07:37:55

标签: javascript json google-app-engine

我想创建一个包含数组的字典,并使用jquery的ajax请求将其发送到GAE。 我正在手动创建的类似于{'a':'text', 'b':'othertext','c':['texta','textb']}的东西。 我可以在GAE上使用self.request.get接收和处理a和b,但不能使用c。

还有其他方法可以在js中创建JSON对象吗?请说明这种方法有什么不对。

3 个答案:

答案 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将仅返回第一个值。