Неожиданный конец ввода json. Файл не может быть полностью проанализирован - PullRequest
0 голосов
/ 16 июня 2020

Я видел похожие вопросы о переполнении стека, а также о других веб-сайтах, и для меня не было найдено ни одного решения. Я работаю над чем-то, что делает запрос на получение. Я использую expressjs, а для получения запроса я использую модуль https. Api, откуда я делаю запрос на получение, - https://api.rootnet.in/covid19-in/stats/latest. Я подтвердил, что он возвращает объект json. Код:

const express = require('express');
const app = express();
const https = require('https');
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());
app.get('/', function(req, res){
  const URL = 'https://api.rootnet.in/covid19-in/stats/latest';
  https.get(URL, function(response){
    response.on('data', function(data){
      console.log(JSON.parse(data));
    });

  });
});
app.listen(3000, function(){
  console.log("server started");
});

вывод, который я получаю:

server started 
undefined:1 
{"success":true,"data":{"summary":{"total":343091,"confirmedCasesIndian":335359,"confirmedCasesForeign":48,"discharged":180013,"deaths":9900,"confirmedButLocationUnidentified":7684},"unofficial-summary":[{"source":"covid19india.org","total":344015,"recovered":180331,"deaths":9920,"active":153721}],"regional":[{"confirmedCasesIndian":41,"confirmedCasesForeign":0,"discharged":33,"deaths":0,"loc":"Andaman and Nicobar Islands","totalConfirmed":41},{"confirmedCasesIndian":6456,"confirmedCasesForeign":0,"discharged":3316,"deaths":88,"loc":"Andhra Pradesh","totalConfirmed":6456},{"confirmedCasesIndian":91,"confirmedCasesForeign":0,"discharged":7,"deaths":0,"loc":"Arunac        

SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (C:\Users\sasmit\Desktop\covid 19\testapp.js:15:24)
    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)

похоже, что он не может проанализировать весь файл.

Ответы [ 2 ]

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

Когда вы пытаетесь parse это как JSON, оно преобразуется в строку, которая пуста. Итак, вы можете попробовать

app.get('/', function(req, res){
   var URL = 'https://api.rootnet.in/covid19-in/stats/latest';

   https.get(URL, function(res){
       var json = '';

       res.on('data', function(data){
           json += data;
       });

       res.on('end', function(){
           var response = JSON.parse(json);
           console.log(" JSON Parserd ", response.success);
       });
   }).on('error', function(e){
         console.log("Error occured while parsing ", e);
   });
});
0 голосов
/ 16 июня 2020

Это потому, что ответ отправляется частями. После каждого фрагмента выдается событие data. Но это не значит, что ответ отправлен полностью. Чтобы убедиться, что ответ завершен, вам нужно использовать событие end и затем проанализировать ответ:

const URL = 'https://api.rootnet.in/covid19-in/stats/latest';
let result = '';
https.get(URL, function(response){
  response.on('data', function(data){
    result += data;
  });
  response.on('end', function() {
    console.log(JSON.parse(result));
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...