服务器不发送回JSON对象

时间:2014-08-31 16:30:55

标签: jquery python json tornado

在客户端,我创建了一个JSON对象,用于在输入字段中存储来自用户输入数据的电子邮件和电子邮件类型。然后我使用ajax将其作为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'])

客户端获取此信息,我尝试迭代密钥:值' s是这样的:

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还是代码?

2 个答案:

答案 0 :(得分:3)

$.each(emaildata, ...)没有迭代ArrayObject。它试图按字符迭代String值。

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

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

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

JavaScript中emails的值至少需要是有效的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的表达式,以直接解析为Array和Object初始值设定项(请注意删除引号):

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

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

答案 1 :(得分:2)

问题在于您执行emaildata=JSON.stringify(emails),但随后尝试使用$.each()检查该变量。因为它是一个字符串,而不是一个对象或数组,jQuery的each()不适用于i。你的意思可能是$.each(emails)