Ошибка: SyntaxError: неожиданный конец ввода JSON - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь получить файл JSON с веб-сайта api, используя приведенный ниже код, но получаю сообщение об ошибке «Неожиданный конец ввода 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);
            })
    })
});

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

В вашем коде есть пара неверных предположений.

1 - Глядя на данные, вы можете видеть, что свойство Title присутствует в каждом отдельном объекте внутри Search свойство, которое является Array, поэтому при правильном синтаксическом анализе JSON у вас будет проблема с got.Title

2 - Событие данные ответ объекта может вызываться несколько раз, пока вы не получите все данные, каждый раз, когда он вызывается, вы получаете кусок данных.

После того, как все данные были отправлены, событие end вызывается, и есть место для анализа JSON.

Ваш код пытается проанализировать неполную строку JSON, только первый фрагмент.

Наиболее распространенный подход - объявить массив вне функций, которые будут обрабатывать события данные и конец . Для каждого события data вы помещаете sh фрагмент во внешний массив, а в событии end вы объединяете его.

Проверьте это:

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)

Я только что протестировал приведенный выше код, и он работает как шарм.

0 голосов
/ 20 июня 2020

Вам не нужно анализировать JSON данные, если они не преобразованы в строку. Большинство API, например этот, возвращают ответ JSON. Это означает, что вы можете удалить JSON .parse из своего кода и получить желаемую функциональность.

    if (https.statusCode === 200) {
        response.on("data", function (data) {
            res.send(got.Title);
        })
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...