我在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);
});
}
请帮帮我吗?
提前感谢您的帮助。
答案 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。