【问题标题】:Cannot Parse JSON data: SyntaxError: Unexpected end of JSON input无法解析 JSON 数据:SyntaxError:JSON 输入意外结束
【发布时间】:2021-01-21 13:49:50
【问题描述】:

我正在尝试解析来自 jokeAPI 的数据以生成随机笑话。我使用了函数 response.on() 和 JSON.parse(),我得到了 200 个 statusCode,所以我知道我的代码可以正常工作,但我不断收到错误。

这是我的代码:

const express = require("express");
const https = require("https");
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.urlencoded({
  extended: true
}));

app.get("/", function(req, res) {
  const url = "https://sv443.net/jokeapi/v2/joke/Any?blacklistFlags=nsfw"
  https.get(url, function(response) {
    console.log(response.statusCode);

    response.on("data", function(data){
      const jokeData = JSON.parse(data);
      console.log(jokeData);
    });

  });
  res.sendFile(__dirname + "/index.html");
});



app.listen(3000, function() {
  console.log("Server is running on port 3000.");
});

这是我在 Hyper 中得到的响应:

Server is running on port 3000.
200
undefined:6
    "delivery": "T
                  

SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (/Users/aimee/Documents/JokeProject/app.js:16:29)
    at IncomingMessage.emit (events.js:315:20)
    at IncomingMessage.Readable.read (_stream_readable.js:506:10)
    at flow (_stream_readable.js:1006:34)
    at resume_ (_stream_readable.js:987:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)
[nodemon] app crashed - waiting for file changes before starting...

我研究了错误,尝试修复我的代码,查看了similar questions like mine on Stack Overflowother sites like teamtreehouse.comstechies.com,尝试了他们和无数其他人的建议,但没有雪茄。有谁知道我该如何解决这个问题?

!!-- 更新--!!

按照T.J. Crowder 的建议阅读ReadableStreamits data event 的文档后,我更新了dwosk 编写的代码:

app.get("/", function(req, res) {
  const url = "https://sv443.net/jokeapi/v2/joke/Any?blacklistFlags=nsfw"
  https.get(url, function(response) {
    console.log(response.statusCode);
    let body = '';

    response.on("data", function(data){
      body += data;
    });
    response.on("end", function() {
      var resp = JSON.parse(body);
      console.log(resp);
    })

  });
  res.sendFile(__dirname + "/index.html");
});

现在我的代码可以工作了,我的数据也被解析了。

Server is running on port 3000.
200
{
  error: false,
  category: 'Programming',
  type: 'single',
  joke: 'If Bill Gates had a dime for every time Windows crashed ... Oh wait, he does.',
  flags: {
    nsfw: false,
    religious: false,
    political: false,
    racist: false,
    sexist: false
  },
  id: 22,
  lang: 'en'
}

它有助于了解 ReadableStream 及其数据事件,并且在我了解到数据回调不是整个主体之后,我设法通过将新数据附加到字符串来获取完整的 JSON 文本,从而使我能够解析数据。

【问题讨论】:

    标签: javascript node.js json parsing syntax


    【解决方案1】:

    每次有数据进入时,data 事件都会触发。

    当您流式传输大量数据时,这非常有用,因为您可以在数据进入时逐块处理。

    不能以增量方式解析 JSON(至少不能使用标准 JSON 解析器)。您需要完整 JSON 文本,否则如您所见,您会得到一个异常。

    每次data 触发时,将新数据附加到字符串

    end 事件触发时,然后将该字符串解析为 JSON。


    您可能希望使用一个库来为您收集所有数据,甚至可能是一个具有用于处理 JSON 的内置工具的库。例如node-fetchaxios

    【讨论】:

      【解决方案2】:

      data 事件为您提供数据,而不是全部数据。请参阅ReadableStream 及其data event 的文档。

      end event 之前,您不知道数据是否完整。以下是来自end 事件文档的示例,展示了其工作原理:

      const readable = getReadableStreamSomehow();
      readable.on('data', (chunk) => {
        console.log(`Received ${chunk.length} bytes of data.`);
      });
      readable.on('end', () => {
        console.log('There will be no more data.');
      });
      

      或者来自http.get documentation 的这个例子(https.get 文档链接到):

      let rawData = '';
      res.on('data', (chunk) => { rawData += chunk; });
      res.on('end', () => {
        try {
          const parsedData = JSON.parse(rawData);
          console.log(parsedData);
        } catch (e) {
          console.error(e.message);
        }
      });
      

      请注意,假设已提供编码,因此块是字符串,而不是 Buffer 实例。

      【讨论】:

        【解决方案3】:

        传递给data 回调的参数不是整个主体。请尝试以下操作:

          const url = "https://sv443.net/jokeapi/v2/joke/Any?blacklistFlags=nsfw"
          https.get(url, function(response) {
            console.log(response.statusCode);
            let body = '';
        
            response.on("data", function(data){
              body += data;
            });
        
            response.on("end", function() {
              var res = JSON.parse(body);
              console.log(res); // prints your api response
            });
          });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-10
          • 1970-01-01
          • 2021-05-01
          • 2021-06-04
          • 2018-08-24
          • 1970-01-01
          相关资源
          最近更新 更多