Django中simplejson返回的JSON.parse错误

时间:2013-06-27 07:35:10

标签: django json simplejson

我有一个视图页面,当前显示了两列数据,很快就会扩展为四列。每列包含该特定模型的QuerySet的结果。

以下是我在views.py方法中的内容:

if request.REQUEST["type"] == "text":
        client = Client.objects.get(client_name = request.REQUEST["search"])
        peerList = ClientPeers.objects.prefetch_related().filter(client = client.client)
        compList = ClientCompetitors.objects.prefetch_related().filter(client = client.client)

else:
    peerList = ClientPeers.objects.prefetch_related().filter(client = request.REQUEST["search"])
    compList = ClientCompetitors.objects.prefetch_related().filter(client = request.REQUEST["search"])

for peer in peerList:
    peerlst.append({"pid" : peer.parentorg.parentorg, "pname" : peer.parentorg.parentorgname})

for comp in compList:
    complst.append({"cid" : comp.parentorg.parentorg, "cname" : comp.parentorg.parentorgname})

lst.append(simplejson.dumps(peerlst))
lst.append(simplejson.dumps(complst))

return HttpResponse(simplejson.dumps(lst), mimetype = "text/json")

这允许我以

格式向浏览器发送2D数据
[ { //JSON }, { //JSON } ]

在我的jQuery.ajax成功函数中,我有

function handler(results) {
  var data = JSON.parse(results);

  for (var i = 0; i < data[0].length; i++)
    $("#available_peers").append("<li>" + data[0][i].pname + "</li>");

  for (var i = 0; i < data[1].length; i++)
    $("#available_competitors").append("<li>" + data[1][i].cname + "</li>");

Firebug显示GET请求有效,我可以在响应选项卡中看到数据。但是,控制台打印出来

SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data
var data = JSON.parse(results)

如果我用

替换var data = JSON.parse(results),则此错误消失
var peers = JSON.parse(data[0]);
var comps = JSON.parse(data[1]);

为什么一种方法有效但另一种方法无效?

1 个答案:

答案 0 :(得分:1)

jQuery ajax()调用将对返回的数据类型进行智能猜测。在您的示例function handler(results)中,results变量已经是已解码的JSON对象,在数组中包含两个项目。 JSON.parse(data[0])有效的原因是您已将JSON编码数据作为字符串返回。

在放入输出数组之前,不要将单个列表元素编码为JSON:

lst.append(peerlst)  # <-- Don't encode to JSON string here
lst.append(complst)

return HttpResponse(simplejson.dumps(lst), mimetype = "application/json") # <-- Single JSON encoding