无法在Backbone集合中获取JSON

时间:2015-01-12 16:12:23

标签: javascript json backbone.js

我有以下Backbone.js代码

var List = Backbone.Collection.extend({
    model: Item,
    url: '/api/items',
});

然后在我看来我尝试执行以下操作从API获取JSON并填充模型

this.collection = new List();

var that = this;
this.collection.fetch({
    success: function () {
        that.render();
        console.log('Fetch successful!');
    },
    error: function() {
        console.log('Failed to fetch!');
    }
});

然而,提取无法正常工作,并且触发了#34;无法获取!"信息。任何人都能看到我做错的事吗?如果我在我的浏览器中转到api/items,我会被提示下载JSON文件,所以它肯定会在那里,当我打开它的新行分隔时。下面是回送JSON的api代码片段

res.writeHead(200, {
    'Content-Type': 'application/x-json-stream'
});

setTimeout(function () {
    var i;
    for (i=0; i<limit; i+=1) {
        res.write(JSON.stringify(createRandomItem(i+skip, sort)) + '\n');
    }
    res.end();
}, 100 + Math.floor(Math.random() * 3000));

当我使用开发人员工具检查发送给API的请求时,我回来的响应似乎是随机字符,我收到错误&#34; SyntaxError:JSON.parse:Unexpected character& #34;

eyJpZCI6IjAtd202MzNjYTF0Y3ZqOWs5Iiwic2l6ZSI6MTYsInByaWNlIjo5MzgsImZhY2

3 个答案:

答案 0 :(得分:9)

您的响应编写循环生成无效的json字符串,因为它只是连接json对象。

您可以收集数组中的所有对象并将其字符串化为:

setTimeout(function () {
    var i, data = [];
    for (i=0; i<limit; i+=1) {
        data.push(createRandomItem(i+skip, sort));
    }

    res.write(JSON.stringify(data));
    res.end();
}, 100 + Math.floor(Math.random() * 3000));

答案 1 :(得分:4)

通常,当您收到 JSON.parse:意外字符错误时,它表示JSON属性不是双引号限定的,因此基本上JSON可能如下所示:

"{ test: 1, testing: 2 }"          *Invalid*

甚至这个:

"{ 'test': 1, 'testing': 2 }"      *Invalid*

而不是这样:

'{ "test": 1, "testing": 2 }'      *Valid*

或者这个:

"{ \"test\": 1, \"testing\": 2 }"  *Valid*

答案 2 :(得分:3)

第一件事是第一件事。你肯定有服务器配置问题。听起来你的mime类型没有设置,你有(可能是gzip)压缩启用。

使用Google Chrome浏览到提供JSON的网址。浏览器应以纯文本显示JSON,而不提示您下载。

接下来获取Chrome的JSONView扩展程序。浏览到提供JSON的URL。你应该在&#34;漂亮&#34;中看到JSON。匹配大括号的格式。

完成后,请返回您的网络应用并进行测试。如果您仍然遇到问题,请发布您的Web服务器信息(类型和版本)以及任何其他特殊信息。我们会从那里出发。