2014-08-31 36 views
-1

在客戶端,我創建了一個JSON對象,用於在輸入字段中存儲來自用戶輸入數據的電子郵件和電子郵件類型。然後我使用ajax將它作爲JSON發送到我的服務器。服務器不發回JSON對象

$(function() { 
$(document).on('click', '.send', function (e) { 
    var dataToSend = []; 
    $('.form-group1').each(function() { 
     var data = {}; 
     $(this).find(':input[data-name]').each(function() { 
      data[$(this).data('name')] = $(this).val(); 
     }); 
     dataToSend.push(data); 
    }); 

    $.ajax({ 
     url: '/pers1', 
     type: 'POST', 
     contentType:'application/json', 
     data: JSON.stringify(dataToSend), 
     dataType:'json', 
    });   
    console.log(JSON.stringify(dataToSend)) 
}); 
}); 

服務器然後存儲到數據庫中作爲JSON對象這樣的:

class PersonalInfoHandler1(BaseHandler): 
@tornado.web.authenticated 
def post(self): 
    global piData 

    receipt = tornado.escape.json_decode(self.request.body) 
    print receipt 

    piData={        
      'emails': receipt, 
      }  

    self.settings['db'].userInfo.update({'PiUsername':self.current_user},{"$set":piData}) 
    print 'from pers1'     
    self.redirect('/pers') 

當頁面重新加載的數據被髮送回另一個Handler爲:

class PersonalInfoHandler(BaseHandler): 
@tornado.web.authenticated 
def get(self): 
    self.render("personal.html", user=self.current_user, ,emails=user['emails']) 

的客戶端得到這個回來,我嘗試迭代關鍵:值是這樣的:

var emails = '{{emails}}'; 
emails = emails.replace(/u'/g,""); 
emails = emails.replace(/'/g,""); 

emaildata=JSON.stringify(emails) 

$.each(emaildata, function(key, value) { 
     alert(key + ': ' + value); 
    }); 

相反,我得到的錯誤在Chrome控制檯:

Uncaught TypeError: Cannot use 'in' operator to search for '28' in "[{emailAdd: , emailDesc: }]" jquery.min.js:2 jquery.min.js:2 m.extend.each jquery.min.js:2 (anonymous function) 

所以我不能遍歷鍵和/或值。實際的JSON或代碼有問題嗎?

+1

我是否正確假設你的回答是一個數組?因爲'in'運算符在對象上工作:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in – naneau 2014-08-31 16:35:44

+0

是的,它是一個數組的排字 – user94628 2014-08-31 16:39:14

回答

3

$.each(emaildata, ...)不重複ArrayObject。它試圖按字符逐個迭代String值。

console.log(typeof emaildata, emaildata); 
// string '"[{emailAdd: , emailDesc: }]"' 

它也是另一個字符串的字符串化形式。

var emails = '[{emailAdd: , emailDesc: }]'; 

emails JavaScript中的價值將至少需要是有效的JSON,這needs encoding from Python,因此它可以be parsed

var emails = '{% raw json_encode(emails) %}'; 
var emaildata = JSON.parse(emails); 

$.each(emaildata, function (key, value) { 
    // ... 
}); 

不過,因爲JSON的語法在JavaScript中,可以輸出JSON來了作爲一個JavaScript的表達式直接解析爲數組和對象初始值設定項(注意刪除引號):

var emails = {% raw json_encode(emails) %}; 

$.each(emails, function (key, value) { 
    // ... 
}); 
+0

謝謝。我嘗試過'var emails ='{{json_encode(emails)}}'; var emaildata = JSON.parse(emails); alert(emaildata);'。但是這現在在控制檯中給出了一個'Uncaught SyntaxError:Unexpected token&pers:1001 (匿名函數)'錯誤 – user94628 2014-08-31 17:21:23

+0

在控制檯中,它表示'var emails ='{{json_encode(emails)}}';'是'VAR電子郵件= '[{" emailAdd ":" "," emailDesc ":" "}]';' – user94628 2014-08-31 17:31:53

+1

@ user94628對不起。它看起來應該使用'{%raw json_encode(emails)%}'](http://stackoverflow.com/questions/6527833/how-do-i-include-quoted-html-in-a-tornado-模板)來防止HTML編碼。我已經使用它更新了我的帖子中的片段。 – 2014-08-31 17:35:29

2

問題出在你做emaildata=JSON.stringify(emails)的事實,但是然後嘗試使用$.each()來檢查該變量。由於它是一個字符串,而不是一個對象或數組,jQuery的each()不適用於我。你可能意思是$.each(emails)

相關問題