当前位置: 首页 > 知识库问答 >
问题:

错误:语法错误:JSON 输入意外结束

黄高爽
2023-03-14

我试图使用下面的代码从一个api网站获取一个JSON文件,但是当我使用下面的代码获取时,我得到一个错误,说“JSON输入意外结束”

var express = require("express");
var app = express();
var body = require("body-parser");
var https = require("https");

app.get("/results", function (req, res) {
    https.get("https://www.omdbapi.com/?apikey=d49698c3&s=harry", function (response) {       

            response.on("data", function (data) {
                var got = JSON.parse(data);
                res.send(got.Title);
            })
    })
});

共有3个答案

司徒宏远
2023-03-14

对于每个遇到相同问题的人。我找到了一个解决方案:

正如 san @Maestre 所解释的那样,您正在解析不完整的 JSON 数据。这就是您收到错误的原因。我已经尝试了两者建议的两种解决方案,但它仍然不适合我。因此,我研究并发现,首先,您需要将数据存储在一个空变量中,一旦数据流完成,您就可以通过执行以下操作来解析它:

  response.on("end", function () {
        var jsonParse = JSON.parse(newsItems);
    });

完整的代码是:

app.get("/", function (req, res) {
    const queryString = "mamamoo";
    const url = "https://newsapi.org/v2/everything?apiKey=<API_KEY>&qInTitle=" + queryString;
    https.get(url, function (response) {
        var newsItems = '';
        response.on("data", function (data) {
            newsItems += data;
        });

        response.on("end", function () {
            var jsonParse = JSON.parse(newsItems);
            console.log(jsonParse);
        });
    });
});

为了解释我的所作所为:

首先,我确保捕捉对我的html" target="_blank">服务器的任何请求。然后,我使用本机节点https请求向api发出请求,捕获响应(响应包含statusCode和其他响应主体)。

但是,我想访问数据正文,因此我执行了“response.on”。首先,我捕获了块中的数据,并将其存储在一个空变量中。

为什么把它存储在一个空变量里?因为如果我没有继续解析它,它会抛出一个错误,说“JSON输入意外结束”,意思是,我正在解析一个不完整的JSON数据。

我所做的下一步是,当数据流完成时,通过指定“end”来解析数据。

希望这有帮助。

松雅昶
2023-03-14

对于大型 json 对象,您可能希望以块的形式解析数据。

接收数据事件上的所有块,并在数据到达后立即对数据进行分组,并在最终事件上解析串联的 json

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

app.get("/results", function (req, res) {
    https.get("https://www.omdbapi.com/?apikey=d49698c3&s=harry", function (response) {       
        let finalData = '';
        response.on("data", function (data) {
            finalData += data.toString();
        });
        response.on("end", function() {
           const parsedData = JSON.parse(finalData);
           res.send(parsedData.Title);
        }
   })
});

app.listen(3000)
景令秋
2023-03-14

代码中存在一些错误的假设。

1 -查看数据,您可以看到属性Title在Search属性内的每个对象中,这是一个< code >数组,因此当JSON得到正确解析时,您会遇到< code > got的问题。标题

2-可以多次调用对象响应的事件数据,直到您可以获取所有数据,每次调用它时,您都会收到一大块数据。

发送完所有数据后,将调用结束事件,并在此处解析 JSON。

您的代码正在尝试解析不完整的JSON字符串,只是第一个块。

最常见的方法是在处理事件数据和结束的函数之外声明一个数组。对于每个数据事件,您将块推送到外部数组中,并在结束事件上连接它。

查看以下内容:

var express = require('express')
var app = express()
var body = require('body-parser')
var https = require('https')

app.get('/results', function (req, res) {
  https.get('https://www.omdbapi.com/?apikey=d49698c3&s=harry', function (response) {
    const chunks = []
    response.on('data', function (chunk) {
      chunks.push(chunk)
    })

    response.on('end', function () {
      const data = Buffer.concat(chunks)
      var got = JSON.parse(data)
      // Try this one out as well
      // res.json(got)
      res.send(got.Search[0].Title)
    })
  })
})

app.listen(3000)

我刚刚测试了上面的代码,它就像一个魅力。

 类似资料:
  • 问题内容: 我得到了以下代码 请注意,我对数据值进行了硬编码。数据被很好地推送到数据库中。但是,我不断收到错误“解析错误语法错误,输入意外结束”。我确定我的数据使用正确的JSON语法。当我在Chrome检查器的网络上进行检查时,saveProduct请求显示数据正确。 此POST请求没有响应。因此,我对于解析错误的来源一无所知。我尝试使用FireFox浏览器。同样的事情发生了。 任何人都可以对什么

  • 我正在尝试在Go API服务器和基于React的前端之间发送JSON。我得到以下错误: 错误:SyntaxError:JSON输入意外结束 它说这发生在第25行,这是 这是相关的函数: 在尝试了一些故障排除之后,我将错误捕捉添加到带有“成功”和“错误”输出的函数中,这样它至少可以停止弹出错误页面,并在API服务器上添加一些控制台输出,以查看数据是否正在传递。 除了出现错误之外,一切似乎都在按预期运

  • 我得到了的意外结束。代码对我来说很好,我错过了什么? 安慰:

  • 问题内容: 我有一个如下所示的Web API控制器: 这是正确的语法,但是当我尝试从Angular 2的服务中调用它时,出现错误消息:“ json解析错误语法错误输入意外结束”。要解决此问题,我必须在ActionResult中输入一个值,例如 我是否缺少某些配置?我的Angular 2服务电话如下所示: 问题答案: 我猜想,当您收到一个空响应(没有有效负载)时,您无需调用该方法。在后台,XHR响应

  • 我在第5个小时,我想是时候寻求帮助了。我正在尝试使用Ajax+PHP将表单上的一个图像和一些文本数据上传到数据库。整个系统是: 一个包含表单php处理页面和javascript函数的输入页面,该函数将表单发布到php处理页面,并将结果返回给上的div 问题是javascript中的$.parsejson(data)命令会导致“Input end of Input”错误: 我以为我的javascri

  • 问题内容: 我有一个SQL查询,当将其放入函数中时,它将停止处理此错误消息。从功能中删除它会使它再次开始工作。 为什么是这样? 问题答案: 缩进的Heredoc分隔符将其破坏。说: 代替