【问题标题】:JSON.parse() fails with unexpected token using Songkick APIJSON.parse() 使用 Songkick API 因意外令牌而失败
【发布时间】:2014-06-22 20:16:45
【问题描述】:

我正在尝试使用 Node 中的以下内容解析来自 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.

如何修复语法错误?

【问题讨论】:

  • JSON.parse(chunk)
  • 你是对的......如果我记录块,它会给我一系列缓冲区。我怎样才能从那些转向可解析的 JSON?
  • 我稍微更改了您的代码并发布了答案。虽然它没有经过实际测试。

标签: json node.js api


【解决方案1】:

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

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();

【讨论】:

    【解决方案2】:

    我会尝试连接字符串(以块的形式到达),然后使用结束事件。喜欢:

    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 作为缓冲区,只有在所有数据都到达时才调用您的函数。

    【讨论】:

    • 嗯,这给了我JSON.parse(data1).resultsPage.results.artist[0].id; ^ TypeError: Cannot read property 'artist' of undefined
    • 好吧,我不知道你的结果字符串的 json。您提供的 API 示例仅在结果下方列出了一个“事件”属性,没有名称为“艺术家”。使用 json.parser.online.fr 之类的东西来可视化你得到的 json 响应。啊,顺便说一句:你只能使用 [0] 如果它真的是一个数组。 json 中的数组类似于 [value1, value2, value2] (注意不同的大括号)。
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 2021-12-03
    • 2021-02-27
    • 2019-01-30
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多