2010-08-02 35 views
1

我想創建一個包含數組的字典並使用jquery的ajax請求將其發送給GAE。 類似 - {'a':'text', 'b':'othertext','c':['texta','textb']}我正在手動創建。 我能夠在GAE上使用self.request.get來接收和處理a和b,但不能使用c。GoogleAppEngine使用javascript的JSON對象

是否有任何其他方式在js中創建JSON對象?請提出這種方法最新的錯誤。

+0

你用什麼jQuery代碼發送請求?我對Python GAE不太瞭解,但似乎request.get處理正常的GET和POST參數,而不是JSON屬性 – 2010-08-02 07:46:49

回答

2

據推測,GAE的self.request.get無法將像字符串數組這樣的複雜對象序列化爲GET請求格式(?a=text&b=othertext...)。

一個解決辦法,但也許不是一個非常靈活的方式,將是序列化值到JSON自己,並傳遞:

var jsonObj = { 
       'a':'text', 
       'b':'othertext', 
       'cJSON': JSON.stringify(['texta', 'textb']) 
       }; 

...然後你當然不得不反序列化cJSON在接收端。

+0

這很好用!謝謝大衛 – Cool 2010-08-04 04:54:18

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)

+0

我明白你的意思,但戴維斯解決方案爲我工作,+1爲您的詳細答案。我非常感謝你的幫助。 – Cool 2010-08-04 04:58:22

1

您實際上正在發送urlencoded請求參數,而不是JSON。 JQuery可能將列表編碼爲同一個參數的多個值,這意味着您可以使用self.request.get_all來訪問它,這將返回一個列表 - self.request.get將只返回第一個值。

+0

嗨,尼克,我試過get_all,但它不工作時,我發送'c':['texta','textb'] – Cool 2010-08-04 04:59:38

+0

@Cool:這不重要,因爲你已經工作了,但'get_all'會如果你像這樣調用它:'self.request.get_all(「c []」)''。默認情況下,jQuery在結尾處使用PHP的慣例'put'來將參數視爲數組。 – 2010-08-04 05:44:02