我一直在尝试将解析后的JSON数据从服务器端(在python中)发送到我的Web应用程序的客户端,然后可以存储它然后显示在页面上。出于某种原因,当数据到达客户端时,它的两端都有奇怪的字符。当我试图迭代我拥有的每个数据列表时,这些字符会导致问题,因为我需要找到列表的长度。这些字符串都不能成功输出到控制台。我在SO和其他地方查找了很多帖子,用于从字符串中删除unicode,使用ast库或只是使用.encode()
函数,但到目前为止还没有解决这个问题。
当我使用Django框架时,数据将在服务器端解析,并通过上下文变量传递给客户端。
以下是服务器上原始的js代码,用于我尝试做的事情:
var $divline = $("<div id = ticketObj></div>");
console.log("length of artist list" + {{venue_names}}.length );
for(var i = 0; i < {{venue_names}}.length; i++){
$divline.append('Artist ' + {{form_artistSelect}} + ' Location: ' {{venue_cities}}[i] ', '{{venue_region}}[i]' Venue: ' + {{venue_names}}[i]
);
}
var $resultObj = $('<div id = "inviteObj" style="margin:100px"></div>');
$resultObj.append($divline);
$resultObj.appendTo($("#results"));
以下是相同代码的页面源版本:
var $divline = $("<div id = ticketObj></div>");
for(var i = 0; i < Miike%20Snow.length; i++){
$divline.append('Artist ' + Miike%20Snow[i] + ' Location: ' ['Miami', 'Miami', 'Miami'] ', '['FL', 'FL', 'FL']' Venue: ' + ['Ultra Music Festival', 'Ultra Music Festival', 'Ultra Music Festival'] );
}
var $resultObj = $('<div id = "inviteObj" style="margin:100px"></div>');
$resultObj.append($divline);
$resultObj.appendTo($("#results"));
在python视图中,我只是获取JSON并解析它:
data = json.load(urllib2.urlopen(url))
#titles = [ i.get("title") for i in data]
raw_dts = [i.get("datetime").encode("utf-8") for i in data]
#formatted_dts = [i.get("formatted_datetime") for i in data]
ticket_urls = [i.get("ticket_url").encode("utf-8") for i in data]
ticket_statuses = [i.get("ticket_status").encode("utf-8") for i in data]
venue_names = [i.get("venue").get("name").encode("utf-8") for i in data]
venue_cities = [i.get("venue").get("city").encode("utf-8") for i in data]
venue_region = [i.get("venue").get("region").encode("utf-8") for i in data]
无论 我使用何种转换方法,一旦将代码发送到客户端,我仍然会收到那些有问题的字符。
这个问题应该非常直接地解决,但是有一些小的东西很可能正在进行并且它阻碍了其他工作。我该如何解决这个问题?
在页面的html中,我有表单,在其下面我有一个名为容器的div:
<form id = "search" method= 'POST' action = ''>{% csrf_token %}
{{ form|crispy }}
<input type= 'submit' value= 'Submit'>
</form><br>
<div id = "container">
然后我尝试将一个无序列表附加到div和列表中,我尝试追加列表元素,但由于某种原因,没有附加任何内容:
var venues = {{venues|safe}};
console.log("length of artist list" + venues.length);
var $list = $("<ul class='list-group'>");
for(var i = 0; i < venues.length; i++){
$list.append("<li class='list-group-item'>Artist {{form_artistSelect}} Location: " venues[i].city ', 'venues[i].region' Venue: ' + venues[i].name + "</ul>");
}
// var $resultObj = $('<div id = "inviteObj" style="margin:100px"></div>');
// $resultObj.append($divline);
$list.appendTo($("#container"));
答案 0 :(得分:1)
这不是JSON问题。这是您如何生成JavaScript的问题。您正在尝试将字符串数据视为JavaScript对象。
此外,这些是 Python 数据结构,而不是JSON列表,因为您已经对它们进行了解码。这里也没有必要将所有内容编码为UTF-8。最后但并非最不重要的是,您可以将场地结构保留为字典/ JSON对象,因为您不需要单独列出这些列表。
您需要将列表转换回JSON,将它们作为JavaScript列表文字插入到生成的JavaScript中,以便您可以将它们视为JavaScript对象(一旦浏览器解析了这些文字)。
data = json.load(urllib2.urlopen(url))
raw_dts = json.dumps([i["datetime"] for i in data])
ticket_urls = json.dumps([i["ticket_url"] for i in data])
ticket_statuses = json.dumps([i["ticket_status"] for i in data])
venues = json.dumps([i["venue"] for i in data])
和你的模板:
var $divline = $("<div id = ticketObj></div>");
var venues = {{ venues|safe }};
console.log("length of artist list" + venues.length );
for(var i = 0; i < venues.length; i++){
$divline.append('Artist {{form_artistSelect}} Location: ' + venues[i].city + ', ' + venues[i].region + ' Venue: ' + venues[i].name
);
}
var $resultObj = $('<div id = "inviteObj" style="margin:100px"></div>');
$resultObj.append($divline);
$resultObj.appendTo($("#results"));
这里{{ venues|safe }}
行告诉Django不要对值进行HTML转义,因为它们已经被编码为JSON了。