【问题标题】:Why can I not parse the JSON from YouTube Data API in node.js为什么我不能从 node.js 中的 YouTube 数据 API 解析 JSON
【发布时间】:2017-10-02 14:43:28
【问题描述】:

我正在尝试将来自 YouTube 数据 API 3 的响应解析到我的 node.js 项目中。当我调用 JSON.parse() 时,它会在 JSON 中途停止并抛出“JSON 输入意外结束”错误。

我是 node.js 和 YouTube 数据 API 的新手,但我找不到任何可能导致此错误的返回的 JSON 问题。

我的请求代码:

   https.get('https://www.googleapis.com/youtube/v3/search?part=snippet&q=' + gameSearch + '+trailer&type=video&videoCaption=closedCaption&key=Google_API_Key', (res) => {


res.on('data', (d) => {

    var result = JSON.parse(d.toString('utf8');

    console.log(result);

响应数据(仅用于上下文示例):

        {
 "kind": "youtube#searchListResponse",
 "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/c5qJp8_01Z7pygk7E4FxXPySdrE\"",
 "nextPageToken": "CAUQAA",
 "regionCode": "US",
 "pageInfo": {
  "totalResults": 834115,
  "resultsPerPage": 5
 },
 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/Kd8M7QMYXGvUuq22Gmm8tSsH2Og\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "QpvM9uwOcUc"
   },
   "snippet": {
    "publishedAt": "2011-06-09T13:13:41.000Z",
    "channelId": "UC64oAui-2WN5vXC7hTKoLbg",
    "title": "Elder Scrolls 5 : Skyrim Official Trailer",
    "description": "Elder Scrolls 5 Skyrim - E3 2011 Trailer. Join us on Facebook : http://facebook.com/GameNewsOfficial. Subscribe Now  ! Bethesda ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/QpvM9uwOcUc/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/QpvM9uwOcUc/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/QpvM9uwOcUc/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "GameNewsOfficial",
    "liveBroadcastContent": "none"
   }
  },
  {
   "kind": "youtube#searchResult",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/9ufokW0y_tAzTii-9cOHe9z-V9M\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "JSRtYpNRoN0"
   },
   "snippet": {
    "publishedAt": "2011-02-23T20:12:28.000Z",
    "channelId": "UCvZHe-SP3xC7DdOk4Ri8QBw",
    "title": "The Elder Scrolls V: Skyrim - Official Trailer",
    "description": "We're pleased to share the first ever in-game trailer for The Elder Scrolls V: Skyrim, the next installment in The Elder Scrolls series from award-winning creators ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/JSRtYpNRoN0/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/JSRtYpNRoN0/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/JSRtYpNRoN0/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Bethesda Softworks",
    "liveBroadcastContent": "none"
   }
  },
  {
   "kind": "youtube#searchResult",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/JmkNelVuuT7Bu7O7dcOyMIu-rIw\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "yoXFk-0NrDI"
   },
   "snippet": {
    "publishedAt": "2010-12-13T21:36:13.000Z",
    "channelId": "UCvZHe-SP3xC7DdOk4Ri8QBw",
    "title": "The Elder Scrolls V: Skyrim Announcement Trailer",
    "description": "Watch the announcement trailer for The Elder Scrolls V: Skyrim... coming to Xbox 360, PlayStation 3, and PC on 11.11.11 ESRB RATING: MATURE with Blood ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/yoXFk-0NrDI/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/yoXFk-0NrDI/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/yoXFk-0NrDI/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Bethesda Softworks",
    "liveBroadcastContent": "none"
   }
  },
  {
   "kind": "youtube#searchResult",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/BNQ1UBBPS3Zb9cjx8Mu1yDEFlo0\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "iX1JmaYdWa0"
   },
   "snippet": {
    "publishedAt": "2014-04-26T02:29:59.000Z",
    "channelId": "UCY7SikBhJcjMbMaN_L7l3WQ",
    "title": "Skyrim - Wyrmstooth trailer",
    "description": "SKYRIM WYRMSTOOTH : http://www.nexusmods.com/skyrim/mods/25704/? ENB : Vividian - http://www.nexusmods.com/skyrim/mods/36067/? MUSIC : 00:00 ...",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/iX1JmaYdWa0/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/iX1JmaYdWa0/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/iX1JmaYdWa0/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Tyroine",
    "liveBroadcastContent": "none"
   }
  },
  {
   "kind": "youtube#searchResult",
   "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/C80AcqmGPGxNkgpTifXvbWmFFBs\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "aLt0rSKClLA"
   },
   "snippet": {
    "publishedAt": "2011-03-04T20:50:59.000Z",
    "channelId": "UCU25Nxe7qWJKtNaTqU9GdSQ",
    "title": "TES:V Skyrim Official Trailer HD (české titulky)",
    "description": "",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/aLt0rSKClLA/default.jpg",
      "width": 120,
      "height": 90
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/aLt0rSKClLA/mqdefault.jpg",
      "width": 320,
      "height": 180
     },
     "high": {
      "url": "https://i.ytimg.com/vi/aLt0rSKClLA/hqdefault.jpg",
      "width": 480,
      "height": 360
     }
    },
    "channelTitle": "Kamil Doskočil",
    "liveBroadcastContent": "none"
   }
  }
 ]
}

我不断收到的错误:

 undefined:46   
    "etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/9ufokW0y_tAzTii-9cOHe9z-V9M\"


    SyntaxError: Unexpected end of JSON input
        at Object.parse (native)
        at IncomingMessage.https.get.res.on (/home/ubuntu/workspace/oldFile.js:289:23)
        at emitOne (events.js:96:13)
        at readableAddChunk (_stream_readable.js:176:18)
        at IncomingMessage.Readable.push (_stream_readable.js:134:10)
        at HTTPParser.parserOnBody (_http_common.js:129:22)
        at TLSSocket.socketOnData (_http_client.js:361:20)
        at emitOne (events.js:96:13)
        at TLSSocket.emit (events.js:188:7)

我可以看到它似乎一直在解析,直到 "items" 数组中的第二个元素,我无法弄清楚它为什么会中断!!

干杯

【问题讨论】:

  • 你的 json 无效。
  • 也许你需要正确设置正确的编码 在 res.on('data',d=> res.setEncoding('utf8'); 之前试试这个
  • JSON 不完整,因为我想保持简短。我已经发布了完整的 JSON 数据。
  • 您好 Fadi,感谢您的回复。我尝试了你的建议,错误仍然没有改变。

标签: json node.js youtube-data-api


【解决方案1】:

您需要保留收到的所有数据块,直到响应结束:

https.get('https://www.googleapis.com/youtube/v3/search?part=snippet&q=' + gameSearch + '+trailer&type=video&videoCaption=closedCaption&key=Google_API_Key', (res) => {
  const chunks = []
  res.on('data', (d) => { chunks.push(d) })
  res.on('end', () => {
    var result = JSON.parse(Buffer.concat(chunks).toString())
    console.log(result)
  })
})

【讨论】:

  • 感谢您为我指明正确的方向。我现在遇到另一个错误。我现在得到的错误是:SyntaxError: Unexpected identifier references the var result declaration。我尝试更改布局并检查是否缺少括号和括号,但我无法找到问题.......
  • @Djinné22 我的错,我在结束听众之前错过了() =>。现在应该好了。
  • 你是个传奇!!非常感谢!辛苦了。
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 2011-11-30
  • 2012-10-02
  • 2015-09-12
  • 2014-08-13
  • 2016-04-25
相关资源
最近更新 更多