无法将JSON字符串解析为对象

时间:2015-03-28 15:53:00

标签: javascript json node.js api

所以我正在尝试从Web服务器检索数据(URL:https://api.uwaterloo.ca/v2/codes/subjects.json?key=6eb0182cf11ca581364ccceee87435f4)。我使用JSON验证器确保了它的有效JSON数据。

我要做的是获取数据数组中主题键的值。但是,当我第一次尝试将响应解析为JSON对象时,它并没有让我感到高兴。

以下是代码段

    var req = https.request('https://api.uwaterloo.ca/v2/codes/subjects.json?key=6eb0182cf11ca581364ccceee87435f4', function(res) {
  //res.setEncoding('utf8');
  res.on('data', function(d) {

    //console.log(Object.prototype.toString.call(d));
    //jsonString = JSON.stringify(d);
    //console.log(jsonString);

    fs.writeFile("./test.txt", d, function(err) {
    if(err) {
        return console.log(err);
    }

    console.log("The file was saved!");
    });

    jsonObject = JSON.parse(d);

    // console.log(typeof(jsonObject.count));

    // for (var key in jsonObject)
    // {
        // if(jsonObject.hasOwnProperty(key))
        // {
            // console.log(key + "=" + jsonObject[key]);
        // }
    // }

  });

});

req.end();

req.on('error', function(e) {
  console.error(e);
});

我收到以下错误

^
SyntaxError: Unexpected end of input
    at Object.parse (native)
    at IncomingMessage.<anonymous> (C:\Users\Chintu\Desktop\Chaitanya\Study\Term
 4B\MSCI 444\Project\Full Calendar\Trial\helloworld.js:79:20)
    at IncomingMessage.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at IncomingMessage.Readable.push (_stream_readable.js:126:10)
    at HTTPParser.parserOnBody (_http_common.js:132:22)
    at TLSSocket.socketOnData (_http_client.js:310:20)
    at TLSSocket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at TLSSocket.Readable.push (_stream_readable.js:126:10)

感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

在解析之前,您不会缓冲整个内容。 data是为单个发出的,可能是也可能不是整个响应。

试试这个:

var req = https.get(url, function(res) {
  if (res.statusCode !== 200)
    res.resume(); // discard any response data
  else {
    var buf = '';
    res.on('data', function(d) {
      buf += d;
    }).on('end', function() {
      var result = JSON.parse(buf);
    });
  }
});