JSON.parse()使用Songkick API失败并带有意外令牌

时间:2014-06-22 20:16:46

标签: json node.js api

我尝试使用节点中的以下内容解析Songkick API的响应:

router.post('/', function(req, res) {
  var artist = req.body.artist;
  var id;
  res.render('artist', { title: 'Artist', artist: artist });
  http.request({host: 'api.songkick.com', path: '/api/3.0/search/artists.json?query=' + artist + '&apikey=myAPIKey'}, function(res) {
    res.on("data", function(chunk) {
      id = JSON.parse(chunk).resultsPage.results.artist[0].id;
      console.log(id);
      http.request({host: 'api.songkick.com', path: '/api/3.0/artists/' + id + '/gigography.json?apikey=Z2JWQTvgk4tsCdDn'}, function(res) {
        res.on("data", function(chunk) {
          console.log(JSON.parse(chunk).resultsPage.results);
        });
      }).end();
    });
  }).end();
});

但是,JSON.parse失败并显示SyntaxError: Unexpected token t(最后一个字符会根据所请求的艺术家而改变)。

Here's an example API response.

如何修复语法错误?

2 个答案:

答案 0 :(得分:0)

我会尝试连接字符串(到达块),然后使用结束事件。像:

router.post('/', function(req, res) {
var artist = req.body.artist;
var id;
var data1 = '';
res.render('artist', { title: 'Artist', artist: artist });
http.request({host: 'api.songkick.com', path: '/api/3.0/search/artists.json?query=' +     
artist + '&apikey=myAPIKey'}, function(res) {
res.on("data", function(chunk) {
       data1 += chunk;
    });
    res.on('end', function(){

  id = JSON.parse(data1).resultsPage.results.artist[0].id;
  console.log(id);
  var data2 = '';
  http.request({host: 'api.songkick.com', path: '/api/3.0/artists/' + id + '/gigography.json?apikey=Z2JWQTvgk4tsCdDn'}, function(res) {
    res.on("data", function(chunk) {
       data2 += chunk;
    });
    res.on('end', function(){
      console.log(JSON.parse(data2).resultsPage.results);
    });
  }).end();
});
}).end();
});

基本上,它使用data1和data2作为缓冲区,并且仅在所有数据到达时调用您的函数。

答案 1 :(得分:0)

与其他答案基本相同。你需要连接数据块并注册一个结束事件并在那里进行解析。 这是我试过的一个,似乎按预期工作。

var http = require('http');
var artist = 'Beatles'
http.request({host: 'api.songkick.com', path: '/api/3.0/search/artists.json?query=' + artist + '&apikey=Z2JWQTvgk4tsCdDn'}, function(res) {
    var response_data = '';
    var id;
    res.on("data", function(chunk) {
        response_data += chunk;
    });
    res.on('end', function(){
        id = JSON.parse(response_data).resultsPage.results.artist[0].id;
        console.log(id);
        http.request({host: 'api.songkick.com', path: '/api/3.0/artists/' + id + '/gigography.json?apikey=Z2JWQTvgk4tsCdDn'}, function(res) {
            var inner_data = '';
            res.on("data", function(chunk) {
                inner_data += chunk;
            });
            res.on("end", function(){
                console.log(JSON.parse(inner_data).resultsPage.results);
            });
        }).end();
    });
}).end();