NodeJS获取请求。 JSON.parse:意外令牌

时间:2016-02-05 15:04:01

标签: json node.js httprequest

我在NodeJS中编写了一个命中Url并检索其json的函数。但我在JSON.parse中遇到错误:意外令牌。

在json验证器中,当我从浏览器复制并粘贴到文本字段时,字符串正在通过测试,但是当我粘贴解析器的Url以获取json时,它会向我显示无效的消息。

我想这是响应的编码,但我可以;弄清楚它是什么。这里如果我的函数有一个例子Url。

function getJsonFromUrl(url, callback)
{
    url = 'http://steamcommunity.com/id/coveirao/inventory/json/730/2/';

    http.get(
        url
        , function (res) {
        // explicitly treat incoming data as utf8 (avoids issues with multi-byte chars)
        res.setEncoding('utf8');

        // incrementally capture the incoming response body
        var body = '';
        res.on('data', function (d) {
            body += d;
        });

        // do whatever we want with the response once it's done
        res.on('end', function () {
            console.log(body.stringfy());
            try {
                var parsed = JSON.parse(body);
            } catch (err) {
                console.error('Unable to parse response as JSON', err);
                return callback(err, null);
            }

            // pass the relevant data back to the callback
            console.log(parsed);
            callback(null, parsed);
        });
    }).on('error', function (err) {
        // handle errors with the request itself
        console.error('Error with the request:', err.message);
        callback(err, null);
    });
}

请帮帮我吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

将响应连接为字符串可能会遇到编码问题,例如如果每个块的缓冲区在开始或结束时转换为具有部分UTF-8编码的字符串。因此,我建议先将缓冲区连接起来:

var body = new Buffer( 0 );
res.on('data', function (d) {
  body = Buffer.concat( [ body, d ] );
});

当然,代表您显式地将缓冲区转换为字符串可能会有所帮助,而不是依赖于JSON.parse()隐式地执行它。在使用异常编码的情况下,这可能是必不可少的。

res.on('end', function () {
  try {
    var parsed = JSON.parse(body.toString("utf8"));
  } catch (err) {
    console.error('Unable to parse response as JSON', err);
    return callback(err, null);
  }
        ...

除此之外,给定URL提供的内容似乎是非常有效的JSON。