服务器不发回JSON对象
在客户端,我创建了一个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或代码有问题吗?
$.each(emaildata, ...)
不重复Array
或Object
。它试图按字符逐个迭代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) {
// ...
});
谢谢。我尝试过'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
在控制台中,它表示'var emails ='{{json_encode(emails)}}';'是'VAR电子邮件= '[{" emailAdd ":" "," emailDesc ":" "}]';' – user94628 2014-08-31 17:31:53
@ 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
问题出在你做emaildata=JSON.stringify(emails)
的事实,但是然后尝试使用$.each()
来检查该变量。由于它是一个字符串,而不是一个对象或数组,jQuery的each()
不适用于我。你可能意思是$.each(emails)
。
我是否正确假设你的回答是一个数组?因为'in'运算符在对象上工作:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in – naneau 2014-08-31 16:35:44
是的,它是一个数组的排字 – user94628 2014-08-31 16:39:14