首页 > 解决方案 > 错误:SyntaxError:JSON 输入意外结束

问题描述

我正在尝试使用以下代码从 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);
            })
    })
});

标签: node.jsjson

解决方案


您的代码中有几个错误的假设。

1 - 查看数据,您可以看到属性Title位于Search属性内的每个对象中,这是一个Array,因此当 JSON 得到正确解析时,您将遇到问题got.Title

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

发送完所有数据后,将调用结束事件,并且可以解析 JSON。

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

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

看一下这个:

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)

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


推荐阅读